原因:
当Activity进入onPause状态之后,SurfaceView会被销毁,进而回调surfaceDestroyed()方法,当你程序从后台切到前台恢复时,SurfaceView并没有重新创建,所以就会出现有声音没画面的情况。
解决方法:
监听SurfaceHolder的callback回调,在surfaceCreated和surfaceDestroyed中处理播放器的播放和停止。代码如下:
getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
Log.d(TAG, "surfaceCreated");
isReady = true;
player.setDisplay(getHolder());
if (!"".equals(url) && !player.isPlaying()) {
try {
player.reset();
player.setDataSource(url);
player.prepare();
player.seekTo(position);
Log.d(TAG, "续播时间:" + position);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
Log.d(TAG, "surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
isReady = false;
Log.d(TAG, "surfaceDestroyed");
if (player.isPlaying()) {
position = player.getCurrentPosition();
Log.d(TAG, "当前播放时间:" + position);
player.stop();
}
}
});
完整的MediaPlayer+SurfaceView使用例子参考另一片博文MediaPlayer+SurfaceView完整例子。