MediaPlayer有时在屏幕被锁定时没有准备

时间:2016-04-02 12:46:49

标签: android media-player android-mediaplayer media prepare

我有一个适用于MediaPlayback的MusicService,它使用具有以下设置的MediaPlayer:

player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);

并设置了那些听众:

OnPreparedListener, OnCompletionListener, OnErrorListener, OnSeekCompleteListener

MediaPlayer用于mp3播放。当一首歌完成时,会调用onCompletion。然后调用PlayNext,重置MediaPlayer,然后使用下一个Track的URI设置Datasource。 Uri载满了:

Uri trackUri = ContentUris .withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songId);

然后播放器准备就绪,然后播放器启动。这工作正常,但有时只有当设备被锁定并且在锁定时播放约1-3首歌曲并且下一首歌曲应该开始时,播放器不会准备直到我击中电源按钮。 想通了,如果我没有点击PowerButton,它需要玩家大约2分钟准备。

我已经记录了所有内容并使用Log.e(...)制作了一些自定义输出。 这是在prepare()之前发出的(prepareAsync()传递相同的结果)被调用: E/MusicService: Preparing now...

当调用onPrepared时,它被推出:

E/MusicService: Player prepared.

所以这是“现在准备......”之后的完整设备输出:

04-02 13:54:55.506 12517-12517/at.htlleonding.musync E/MusicService: Preparing now.
04-02 13:54:55.525 811-888/? E/libsuspend: Error writing to /sys/power/state: Device or resource busy
04-02 13:54:55.544 246-14756/? D/offload_visualizer: thread exit
04-02 13:54:55.546 246-14754/? V/offload_effect_bundle: offload_effects_bundle_hal_stop_output output 1879 pcm_id 9
04-02 13:54:55.546 246-14754/? D/hardware_info: hw_info_append_hw_type : device_name = speaker
04-02 13:54:55.549 246-14752/? E/audio_hw_primary: offload_thread_loop: Compress handle is NULL
04-02 13:54:55.549 246-924/? D/audio_hw_primary: adev_close_output_stream: enter:stream_handle(0xb5bfa640)
04-02 13:54:55.549 246-924/? D/audio_hw_primary: out_standby: enter: stream (0xb5bfa640) usecase(3: compress-offload-playback)
04-02 13:54:55.555 246-924/? W/AudioFlinger: moveEffectChain_l() effect chain for session 0 not on source thread 0xb59fa000
04-02 13:54:55.611 246-15030/? I/FFmpegExtractor: android-source:0xb1834060
04-02 13:54:55.820 811-888/? E/libsuspend: Error writing to /sys/power/state: Device or resource busy
04-02 13:54:55.972 246-15030/? I/FFMPEG: [mp3 @ 0xae2f4400] Skipping 0 bytes of junk at 2177007.

...然后在我击中PowerButton之前没有输出。然后歌曲就准备好了。

如果在我按下PowerButton之后有人对完整输出感兴趣,直到“玩家准备好”被调用,I created a Gist here

旁注: 使用App时,会在某些片段中显示一些相册封面。它们装载了Picasso,所以我不需要担心内存缓存。一些ImageViews没有Picasso(例如,包含我的PlayerControls的drawables的ImageViews)。也许内存/资源存在问题?

1 个答案:

答案 0 :(得分:0)

我可能在另一个帖子中找到了答案,其中有些人在播放音乐here时遇到了同样的问题。

我的最终解决方案是在准备歌曲之前使用 WakeLock ,然后再次发布onPrepared和onError以及我服务的onDestroy。将它再次释放到安全的电池是很重要的。在发布之前一定要check if the WakeLock is held

我在onCreate of my Service中创建了这样的WakeLock:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MusicService");

AQUIRE:

wakeLock.acquire();

释放:

if(wakeLock.isHeld())
        wakeLock.release();

现在测试播放约10分钟,直到现在还没有停止。我不知道这是否是一种非常安全的电池解决方案