我有一个媒体播放器在一个活动(称为播放器),我希望能够支持连续视频播放时,播放器是关闭成一个小型视图的父活动。
在只有音频的情况下,我能够很好地做到这一点,问题在于我通过mediaPlayer.setDisplay()附加了一个mediaPlayer.setDisplay;
我可以附加SurfaceView刚开始只是很好,但问题开始时,我关闭播放器活动。如果我不做任何更改,mediaPlayer就会以通常的无用错误(1,-19)被抛入错误状态。
当播放器setDisplay被销毁时,我尝试使用SurfaceView (Null),这似乎是有效的。但出于某种原因,它重置了视频流。为了弄清发生了什么,我尝试过重写seekTo(),但是没有调用seekTo()。我还把日志语句放在我能想到的任何地方,但没有触发任何东西。
为什么setDisplay(null)会导致我的视频流重新启动?
下面是我当前的MediaPlayer代码(一些奇怪的东西来自于我试图解决这个问题(比如isReallyPlaying()):
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;
}
发布于 2016-10-05 19:17:05
弄明白了。显然,关闭某个活动会导致音频丢失,其值为AudioManager.AUDIOFOCUS_LOSS。
因为我是一个好的安卓公民,这是准备释放媒体播放器。但音频将被恢复,这将导致我的媒体播放器得到重置,因此从一开始。
这恰好发生在setDisplay()方法周围。
https://stackoverflow.com/questions/39823674
复制