有时MediaPlayer prepareAsyc()在按下POWER之前不会调用onPrepared()

时间:2010-11-11 02:25:59

标签: android

我一直试图重现我的QA团队称之为“随机暂停错误”的内容已有一段时间了。今天,我在使用logcat进行调试时再现了三次。它间歇性出现,只在网络不佳中出现。

用户会遇到音频暂停,直到他们触摸手机(按下电源或轨迹球)并立即开始播放。这是因为我在onPrepared回调中调用start,并且在这些情况下从不调用start。这是我们最严重的错误。

我所知道的:

1)这种情况会在带有2.2.1的Nexus One上间歇性地发生(不确定它是否在其他设备上)

2)当设备屏幕关闭时,我从PlaybackService调用prepareAsyc()。有时,onPrepared()永远不会被调用,因此我的后续mediaplayer.start()调用永远不会被触发。我可以看到网络嗅探器和缓冲回调缓冲正在发生。

3)如果我触摸设备电源或轨迹球将其唤醒,立即调用onPrepared()(已经缓冲)并且我的回调开始播放。

以下是带有时间戳的日志,显示问题三次:

第一个例子(在我按下电源按钮之前20秒没有回调):

11-10 16:10:55.966 I/AwesomePlayer(   59): calling prefetcher->prepare()
11-10 16:11:15.511 D/KeyguardViewMediator(   94): wakeWhenReadyLocked(26)
11-10 16:11:15.511 D/KeyguardViewMediator(   94): handleWakeWhenReady(26)
11-10 16:11:15.511 D/KeyguardViewMediator(   94): pokeWakelock(5000)
11-10 16:11:15.511 I/power   (   94): *** set_screen_state 1
11-10 16:11:15.561 D/SurfaceFlinger(   94): Screen about to return, flinger = 0x1fe300
11-10 16:11:15.701 D/AK8973  (   64): Compass Start
11-10 16:11:15.701 D/WifiService(   94): ACTION_SCREEN_ON
11-10 16:11:15.711 I/Prefetcher(   59): [0x602d80] cache below low water mark, filling cache.
11-10 16:11:15.821 I/AwesomePlayer(   59): prefetcher is done preparing
11-10 16:11:15.831 W/MogMediaPlayer.onPreparedListener( 2968): onPrepared, calling notifyPrepared()

另外两个例子(我在击中力量之前的第一次,下一次是8s):

11-10 16:14:54.649 I/AwesomePlayer(   59): calling prefetcher->prepare()
11-10 16:14:57.500 D/KeyguardViewMediator(   94): wakeWhenReadyLocked(26)
11-10 16:14:57.500 D/KeyguardViewMediator(   94): handleWakeWhenReady(26)
11-10 16:14:57.500 D/KeyguardViewMediator(   94): pokeWakelock(5000)
11-10 16:14:57.500 I/power   (   94): *** set_screen_state 1
11-10 16:14:57.560 D/SurfaceFlinger(   94): Screen about to return, flinger = 0x1fe300
11-10 16:14:57.580 D/WifiStateTracker(   94): Reset connections and stopping DHCP
11-10 16:14:57.580 D/WifiService(   94): ACTION_SCREEN_ON
11-10 16:14:57.670 I/Prefetcher(   59): [0xa990] cache below low water mark, filling cache.
11-10 16:14:57.700 D/AK8973  (   64): Compass Start
11-10 16:14:57.800 I/AwesomePlayer(   59): prefetcher is done preparing
11-10 16:14:57.800 W/MogMediaPlayer.onPreparedListener( 2968): onPrepared, calling notifyPrepared()



11-10 16:39:03.608 I/AwesomePlayer(   59): calling prefetcher->prepare()
11-10 16:39:11.506 D/KeyguardViewMediator(   94): wakeWhenReadyLocked(26)
11-10 16:39:11.506 D/KeyguardViewMediator(   94): handleWakeWhenReady(26)
11-10 16:39:11.506 D/KeyguardViewMediator(   94): pokeWakelock(5000)
11-10 16:39:11.506 I/power   (   94): *** set_screen_state 1
11-10 16:39:11.566 D/SurfaceFlinger(   94): Screen about to return, flinger = 0x1fe300
11-10 16:39:11.586 D/WifiStateTracker(   94): Reset connections and stopping DHCP
11-10 16:39:11.586 D/WifiService(   94): ACTION_SCREEN_ON
11-10 16:39:11.716 D/AK8973  (   64): Compass Start
11-10 16:39:11.766 I/Prefetcher(   59): [0x59ac18] cache below low water mark, filling cache.
11-10 16:39:11.856 I/AwesomePlayer(   59): prefetcher is done preparing
11-10 16:39:11.946 W/MogMediaPlayer.onPreparedListener( 2968): onPrepared, calling notifyPrepared()

有没有人知道这个bug或如何解决它?

提前致谢, 本

2 个答案:

答案 0 :(得分:2)

我在Android 2.3.3,2.3.7和4.1.2上遇到了类似的问题。对我来说,经过一段时间的工作,MediaPlayer随机拒绝加载。不同的是,对我来说,电源按钮也没有任何帮助 - 没有任何东西,onPrepared根本就没有被调用过。我正在播放SD卡而不是网络中的文件,因此缓冲不是问题。当频繁加载文件时会发生更多情况,但一般来说,错误很容易发生,足以影响所有我的用户。

你的问题似乎与我的问题有关,但遗憾的是我也没有答案。我在这里张贴这个以收集有关该问题的更多信息。我尝试使用setDataSource,prepare,prepareAsync以及MediaPlayer.create()方法,该方法立即开始加载指定的文件。我尝试重复使用相同的mediaplyer(使用mp.reset())以及为每个要加载的新文件创建一个全新的文件(我在之前的播放器上停止并调用release()),但没有任何区别:如果用户开始更快地切换文件(但没有过多 - 我希望任何媒体应用程序都能处理这个问题),每5个文件中就有1个未能指示失败或加载。

答案 1 :(得分:0)

最后在另一个线程中找到了一个解决方案,其中有人在使用MediaPlayer here传输音频时遇到了一些问题。

诀窍是在下一首曲目通过wakeLock准备之前唤醒设备。这并不会导致屏幕亮起,所以不用担心。描述了我最终如何做到here