Android MediaPlayer有时在屏幕锁定时不准备

Android MediaPlayer有时在屏幕锁定时不准备,android,media-player,android-mediaplayer,media,prepare,Android,Media Player,Android Mediaplayer,Media,Prepare,我有一个MediaPlayback音乐服务,它使用MediaPlayer进行以下设置: player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); player.setAudioStreamType(AudioManager.STREAM_MUSIC); 这些侦听器已设置为: OnPreparedListener, OnCompletionListener, OnErrorListener, OnSe

我有一个MediaPlayback音乐服务,它使用MediaPlayer进行以下设置:

player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
这些侦听器已设置为:

OnPreparedListener, OnCompletionListener, OnErrorListener, OnSeekCompleteListener
MediaPlayer用于mp3播放。当一首歌结束时,调用onCompletion。然后调用PlayNext,重置MediaPlayer,然后使用下一个曲目的URI设置数据源。Uri加载有:

uritrackuri=ContentUris
.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,songId)

然后玩家准备好,然后玩家开始。这工作正常,但仅在某些情况下,当设备锁定并在锁定时播放约1-3首歌曲时,并且下一首歌曲应该开始播放,直到我按下电源按钮,播放器才开始准备。我发现,如果我不按下电源按钮,玩家大约需要2分钟来准备

我现在已经记录了所有内容,并使用Log.e(…)进行了一些自定义输出。 这是在调用prepare()之前发出的(prepareAsync()提供相同的结果):
E/MusicService:现在就开始准备…

当调用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.
。。。然后在我按下电源按钮之前没有输出。然后歌曲就准备好了

如果有人在我按下电源按钮直到调用“玩家准备就绪”后对完整输出感兴趣

旁注:
当应用程序被使用时,一些专辑封面会以片段的形式显示出来。它们都是毕加索的,所以我不需要担心内存缓存。有些图像视图是在没有毕加索的情况下填充的(例如,保存我的PlayerControl可绘制控件的图像视图)。也许内存/资源有问题?

我可能在另一个线程中找到了答案,其中一些人在播放流媒体音乐时遇到了同样的问题

我的最终解决方案是使用WakeLock,这是我在准备一首歌曲并在我的服务的Prepared and onError and onDestroy上再次发布之前需要的。再次释放它以节省电池非常重要。请确保在释放之前将其锁定

我在onCreate of my Service中创建WakeLock,如下所示:

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

wakeLock.acquire();
发布:

if(wakeLock.isHeld())
        wakeLock.release();
    
现在测试播放大约10分钟,直到现在才停止。我不知道这是否是一个非常节省电池的解决方案