0

У меня есть SurfaceView и я играть видео с sdcard.When видео закончена я пытаюсь показать изображение 5 секунды, а затем снова играть свою video.when я бегу мое приложение и видео Закончился у меня есть IllegalStateExceptionMediaPlayer IllegalStateException в Android

videoSurface = (SurfaceView) findViewById(R.id.videoSurface); 
    videoHolder = videoSurface.getHolder(); 
    videoHolder.addCallback(this); 

    player = new MediaPlayer(); 
    controller = new VideoControllerView(this); 
    player.setOnPreparedListener(this); 


    try { 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     String filePath = Environment.getExternalStorageDirectory() + "/myvideo/Sample.mp4"; 
     player.setDataSource(filePath); 
     player.setOnPreparedListener(this); 

     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       videoSurface.setVisibility(View.INVISIBLE); 
       findViewById(R.id.imageView).setVisibility(View.VISIBLE); 
       Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           findViewById(R.id.imageView).setVisibility(View.INVISIBLE); 
           videoSurface.setVisibility(View.VISIBLE); 

          } 
         }); 
         player.start(); 

        } 
       }, 5000); 

      } 
     }); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 



@Override 
public boolean onTouchEvent(MotionEvent event) { 
    controller.show(); 
    return false; 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    player.setDisplay(holder); 
    player.prepareAsync(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

} 
@Override 
public void onPrepared(MediaPlayer mp) { 
    controller.setMediaPlayer(this); 
    controller.setAnchorView((RelativeLayout) findViewById(R.id.videoSurfaceContainer)); 
    player.start(); 
} 

@Override 
public boolean canPause() { 
    return true; 
} 

@Override 
public boolean canSeekBackward() { 
    return true; 
} 

@Override 
public boolean canSeekForward() { 
    return true; 
} 

@Override 
public int getBufferPercentage() { 
    return 0; 
} 

@Override 
public int getCurrentPosition() { 
    return player.getCurrentPosition(); 
} 

@Override 
public int getDuration() { 
    return player.getDuration(); 
} 

@Override 
public boolean isPlaying() { 
    return player.isPlaying(); 
} 

@Override 
public void pause() { 
    player.pause(); 
} 

@Override 
public void seekTo(int i) { 
    player.seekTo(i); 
} 

@Override 
public void start() { 
    player.start(); 
} 

@Override 
public boolean isFullScreen() { 
    return false; 
} 

@Override 
public void toggleFullScreen() { 

} 

может быть проблема в этой линии

videoSurface.setVisibility(View.VISIBLE); 

, что я делаю неправильно в моем коде?

+0

разместить Ваш LogCat ERRORLOG – X3Btel

+0

Что делать, если вы закомментировать изменения видимости поверхности внутри onCompletionListener (два раза)? Я считаю, что изменение видимости вызывает некоторые обратные вызовы (например, onSurfaceChanged), что помещает игрока в недействительное состояние. –

ответ

Смежные вопросы