Android MediaPlayer 在屏幕关闭时冻结
Android MediaPlayer Freezes when Screen Off
我编写了一个使用 MediaPlayer 播放 MP3 文件的音乐播放器应用程序。大多数情况下它工作正常,但是当我关闭 phone 上的屏幕时,prepare() 方法可能会冻结,直到我打开屏幕。一亮屏就没了
这非常令人沮丧,因为它并不总是发生,而是在屏幕关闭的情况下播放大约 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",然后 'prepare' 直到我在大约 30 秒后打开屏幕才被处理。
更新:我什至尝试过 prepareAsync() 并且它有同样的问题。这是在三星 Galaxy S4 上。如果我不能让它可靠地工作,我可以试试 ExoPlayer。
我相信下面缺少的行解决了我的问题:
mMediaPlayer.setWakeMode( getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK );
但是..
更糟糕的是,在我重新启动 phone 后,我无法通过上述更改播放任何音乐!
现在我得到:
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
看来我需要等待我的 phone 准备就绪,然后 MediaPlayer 才能工作。它甚至在选择项目时都不会发出哔哔声,直到它完全醒来。
我编写了一个使用 MediaPlayer 播放 MP3 文件的音乐播放器应用程序。大多数情况下它工作正常,但是当我关闭 phone 上的屏幕时,prepare() 方法可能会冻结,直到我打开屏幕。一亮屏就没了
这非常令人沮丧,因为它并不总是发生,而是在屏幕关闭的情况下播放大约 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",然后 'prepare' 直到我在大约 30 秒后打开屏幕才被处理。
更新:我什至尝试过 prepareAsync() 并且它有同样的问题。这是在三星 Galaxy S4 上。如果我不能让它可靠地工作,我可以试试 ExoPlayer。
我相信下面缺少的行解决了我的问题:
mMediaPlayer.setWakeMode( getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK );
但是..
更糟糕的是,在我重新启动 phone 后,我无法通过上述更改播放任何音乐!
现在我得到:
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
看来我需要等待我的 phone 准备就绪,然后 MediaPlayer 才能工作。它甚至在选择项目时都不会发出哔哔声,直到它完全醒来。