关闭屏幕时Android MediaPlayer冻结
问题描述:
我已经编写了一个使用MediaPlayer播放MP3文件的音乐播放器应用程序。它大部分时间都能正常工作,但是当我关掉手机上的屏幕时,prepare()方法会冻结,直到我打开屏幕。只要屏幕打开,就离开它。关闭屏幕时Android MediaPlayer冻结
这非常令人沮丧,因为它并不总是发生,但在关闭屏幕后播放约3个乐曲后发生。我没有任何例外。
mMediaPlayer.reset();
LogDebugf( "MP3_PLAY::mMediaPlayer.setDataSource..\n");
mMediaPlayer.setDataSource(mMP3Path);
LogDebugf( "MP3_PLAY::mMediaPlayer.prepare..\n");
mMediaPlayer.prepare();
// Can freeze for long times or until screen turned on in above call
LogDebugf( "MP3_PLAY::mMediaPlayer.start..\n");
mMediaPlayer.start();
我的实际的logcat如下所示:
03-09 08:04:07.333 I/System.out(8186): MP3_PLAY::mMediaPlayer.prepare..
03-09 08:04:07.333 V/MediaPlayer(8186): setVideoSurfaceTexture
// Notice the huge delay here until I switch the screen on
03-09 08:04:31.049 V/MediaPlayer(8186): prepare
03-09 08:04:31.059 V/MediaPlayer(8186): message received msg=200, ext1=973, ext2=0
03-09 08:04:31.059 W/MediaPlayer(8186): info/warning (973, 0)
03-09 08:04:31.059 V/MediaPlayer(8186): callback application
03-09 08:04:31.059 V/MediaPlayer(8186): back from callback
03-09 08:04:31.059 V/MediaPlayer(8186): message received msg=5, ext1=0, ext2=0
03-09 08:04:31.059 V/MediaPlayer(8186): New video size 0 x 0
03-09 08:04:31.059 V/MediaPlayer(8186): callback application
03-09 08:04:31.059 V/MediaPlayer(8186): back from callback
03-09 08:04:31.059 V/MediaPlayer(8186): message received msg=1, ext1=0, ext2=0
03-09 08:04:31.059 V/MediaPlayer(8186): prepared
03-09 08:04:31.059 V/MediaPlayer(8186): signal application thread
03-09 08:04:31.059 V/MediaPlayer(8186): callback application
03-09 08:04:31.059 V/MediaPlayer(8186): prepare complete - status=0
03-09 08:04:31.059 V/MediaPlayer(8186): back from callback
03-09 08:04:31.059 I/System.out(8186): MP3_PLAY::mMediaPlayer.start..
之前冻结是“setVideoSurfaceTexture”,然后“准备”出现不被处理,直到我打开屏幕〜30中的最后一行几秒钟后。
更新:我甚至尝试prepareAsync(),它有同样的问题。这是在三星Galaxy S4上。如果我无法可靠地运行,我可能会尝试给ExoPlayer。
答
我相信下面的缺失行解决我的问题:
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
但..
更糟糕的是,当我重新启动我的电话,我不能播放任何音乐都与上面的变化!
现在,我得到:
03-10 18:29:09.857 V/MediaPlayer(2119): message received msg=100, ext1=1, ext2=-2147483648
03-10 18:29:09.857 E/MediaPlayer(2119): error (1, -2147483648)
03-10 18:29:09.857 V/MediaPlayer(2119): callback application
03-10 18:29:09.857 V/MediaPlayer(2119): back from callback
03-10 18:29:09.877 I/MediaPlayer(2119): send context aware event
03-10 18:29:09.877 I/MediaPlayer(2119): sendBroadcast CONTEXT_AWARE_MUSIC_INFO - type(error) - id (4)
03-10 18:29:09.877 E/MediaPlayer(2119): Error (1,-2147483648)
03-10 18:29:09.877 I/System.out(2119): OnErrorListener::MP3 ERROR 1 -2147483648
这样看来,我需要等待我的手机准备就绪之前的MediaPlayer会工作。选择物品直至完全醒来时,它甚至不会发出蜂鸣声。