问题描述
我正在使用我自己的音乐播放器应用程序,该应用程序使用带有 android.media.MediaPlayer
和唤醒模式 PARTIAL_WAKE_LOCK
的前台服务来播放音乐。权限 FOREGROUND_SERVICE
和 WAKE_LOCK
在清单中声明。
多年来,所有这些在我运行 Android 9 (API 28) 的华为设备上运行良好,但在我运行 Android 10 (API 29) 的新三星 galaxy A51 上,音乐在一段时间后停止播放。前几首歌曲很好,但在到达上一首歌曲结束后下一首歌曲不会开始播放(下一首歌曲在MediaPlayer.OnCompletionListener.onCompletion()
中开始)。并不是应用程序被杀死了,只要我打开屏幕,下一首歌曲就会开始播放。
我已尝试在 Android 首选项“应用/特殊访问/优化电池使用”中将我的应用列入白名单,并使用 ACTION_REQUEST_IGnorE_BATTERY_OPTIMIZATIONS
。我读过有关使用 MediaSession
之类的内容将我的应用注册为音乐播放器的内容,以及其他一些描述类似问题的 StackOverflow 帖子,我尝试了一些解决方案,但没有任何效果。也许有人可以把我送到正确的方向。
编辑:这是从服务启动 MediaPlayer
的方式(缩小版):
@Override
public void onCreate() {
player = new MediaPlayer();
player.setWakeMode(getApplicationContext(),PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioAttributes(new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
player.setonPreparedListener(this);
player.setonCompletionListener(this);
player.setonErrorListener(this);
}
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
play();
}
public void play() {
player.reset();
player.setDataSource(getApplicationContext(),getSong().getContentUri());
player.prepareAsync();
}
@Override
public void onPrepared(MediaPlayer player) {
setVolume();
player.start();
}
@Override
public void onCompletion(MediaPlayer player) {
// Go to next song.
play();
}
解决方法
我认为这是存储权限问题
在 Android Q 中如果您授予权限并且它被授予或不起作用,请转到清单并添加 android:requestLegacyExternalStorage="true"
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true" //Add this Line
android:label="@string/app_name">
---------<Activity,Sevices or Recivers>----------
</application>