【问题标题】:Music player stops音乐播放器停止
【发布时间】:2021-02-17 09:43:25
【问题描述】:

我正在使用我自己的音乐播放器应用程序,该应用程序使用带有 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();
}

【问题讨论】:

  • 也许包括你当前的所有代码,足以让其他人复制粘贴作为一个完整的例子,可能会给你更好的答案
  • 我已经阅读了其他几篇文章,例如 stackoverflow.com/questions/37834195/…、stackoverflow.com/questions/64684419/… 和 stackoverflow.com/questions/49098126/…,但似乎没有任何效果。像 Spotify 这样的应用程序似乎运行良好。谁能帮帮我?
  • 尝试点击此链接可能会有所帮助。否则请分享代码,以便我可以进一步为您提供帮助。 stackoverflow.com/a/60235317/14884388
  • 我没有尝试记录任何内容,也没有 IllegalStateException。我不知道你还需要什么其他代码,我已经分享了显示我的 MediaPlayer 是如何启动的代码。
  • 你的日志猫在说什么?尝试在连接的设备上运行歌曲并在应用崩溃时查看 logcat 上的错误

标签: android audio-player


【解决方案1】:

我认为这是存储权限问题

在 Android Q 中,如果您授予权限并且授予权限或不工作,请转到 Manifest 并添加 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>

【讨论】:

  • 我的清单中已经有该行,或者它甚至一开始就不起作用。但是我的设备最近更新到了 Android11,这似乎已经解决了这个问题。
  • 在您将应用更新为面向 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多