하나의 활동 (플레이어라고 함)에 미디어 플레이어가 있고 플레이어가 부모 활동의 축소판보기로 닫힐 때부터 연속적인 비디오 재생을 지원할 수 있기를 바랍니다.MediaPlayer 및 SurfaceView 여러 활동 이상
오디오 만 인 경우이 작업을 수행 할 수 있습니다. MediaPlayer.setDisplay()를 통해 SurfaceView를 연결할 때 문제가 있습니다.
처음에는 SurfaceView를 잘 붙일 수 있지만 플레이어 활동을 닫으면 문제가 시작됩니다. 변경하지 않으면 보통 도움이되지 않는 오류 (1, -19)로 인해 mediaPlayer가 오류 상태가됩니다.
플레이어 SurfaceView가 파괴되어 작동하는 것처럼 보이면 setDisplay (null)를 사용하려고했습니다. . 그러나 어떤 이유로 그것은 비디오 스트림을 재설정합니다. 무슨 일이 일어나고 있는지 알아 내려고 seekTo()를 시도했지만 seekTo()가 호출되지 않습니다. 나는 또한 생각할 수있는 모든 곳에서 로깅 문장을 넣었지만 아무것도 트리거되지 않았습니다.
왜 setDisplay (null)로 인해 내 비디오 스트림이 다시 시작됩니까? 여기
는 (이상한 물건 중 일부는 나를 isReallyPlaying (같은 문제를 해결하기 위해 노력에서 내 현재 MediaPlayer를 코드입니다()).private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private ScheduledFuture beeperhandle;
private boolean isPaused = false;
private BaseMedia currentMedia;
private PlaybackService.RepeatStatus repeatStatus = PlaybackService.RepeatStatus.REPEAT_NONE;
public void startMedia(BaseMedia model, Integer position) {
Timber.d("Starting media");
startBeeper();
isPaused = false;
lastBeep = -1;
currentMedia = model;
if (position != null) {
seekTo(position);
}
super.start();
}
public BaseMedia getCurrentMedia() {
return currentMedia;
}
@Override
public void start() throws IllegalStateException {
Timber.e("Invalid start called, should request startSong or startVideo");
}
private int lastBeep = -1;
// Because isPlaying is returning false and canceling the beeper. Probably has something to do with the surfaceview being destroyed
private boolean isStillPlaying() {
if (lastBeep != getCurrentPosition()) {
lastBeep = getCurrentPosition();
return true;
}
return false;
}
private final Runnable seekBarCheck = new Runnable() {
public void run() {
if (isStillPlaying() && !beeperhandle.isCancelled()) {
EventBus.getDefault().post(new MusicStatusTimeEvent(
currentMedia, true, GevaldMediaPlayer.this));
} else {
Timber.d("Canceling Beeper, !isPlaying");
beeperhandle.cancel(true);
}
}
};
private void startBeeper() {
Timber.d("Starting Beeper");
beeperhandle = scheduler.scheduleAtFixedRate(seekBarCheck, 100, 100, TimeUnit.MILLISECONDS);
}
@Override
public void seekTo(final int msec) throws IllegalStateException {
Timber.d("Seeking to " + msec);
if (beeperhandle != null) {
Timber.d("Canceling beeper in prep for seek");
beeperhandle.cancel(true);
}
setOnSeekCompleteListener(new OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
Timber.d("Seek complete to: " + msec);
startBeeper();
}
});
super.seekTo(msec);
}
@Override
public void stop() throws IllegalStateException {
super.stop();
Timber.d("Stopping media");
doStop();
}
private void doStop() {
if (beeperhandle != null) {
Timber.d("Canceling beeper, doStop");
beeperhandle.cancel(true);
}
isPaused = false;
}
@Override
public void pause() throws IllegalStateException {
Timber.d("Pause requested");
if (beeperhandle != null) {
Timber.d("Canceling beeper, pause");
beeperhandle.cancel(true);
}
doStop();
EventBus.getDefault().post(new MusicStatusStoppedEvent(this));
super.pause();
}
public boolean isPaused() {
return isPaused;
}