gpt4 book ai didi

android - 如何在 Spotify 和 Google Music 等后台播放音乐时关闭通知

转载 作者:搜寻专家 更新时间:2023-11-01 09:22:35 25 4
gpt4 key购买 nike

Spotify 和 Google Music 允许用户在后台播放音乐,还允许忽略媒体通知。当您将这些应用程序之一移至后台,然后暂停播放时,您可以关闭媒体通知。但是,如果您不关闭通知,它会长时间处于暂停状态,系统不会终止“音频服务”,因为通知始终可见并立即对播放/暂停使用react。

据我所知,使用前台服务是不可能的,因为为了消除通知,我们需要调用 stopForeground(false),这会让系统终止服务。

这是我们现在如何在我们的应用程序中执行此操作:

播放开始后,我们使用以下代码将 MusicService 作为前台服务运行:

startForeground(mediaNotification)

然后,当用户离开应用程序时,他可以通过媒体通知来控制播放。由于通知与 MusicService 紧密耦合,因此在我们调用之前用户无法关闭它:

stopForeground(假)

这就是我们在用户按下暂停按钮时调用此方法的原因。但是这会产生一个服务后台,所以系统会在短时间内将其杀死。

Spotify 和 Google Music 如何解决这个问题?实现方式是什么?

最佳答案

结合使用 Pouya 的回答和一些独立研究,我有一个代码 fragment ,其行为非常接近于使用 OOTB MediaPlayer 的 Spotify 等应用程序。可能有一个更优雅的解决方案,但这是一个快速而肮脏的版本 - 我有太多散落的代码要发布,所以有一个概述:

当媒体播放器暂停时,我运行了两段代码。首先,更新通知栏后,我将它从前台服务降级为后台服务:

public void demoteNotifyBar() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
stopForeground(STOP_FOREGROUND_DETACH);
else
stopForeground(false);
}

然后我启动一个新计时器,它每秒重新制作一次通知栏:

// Put this in the onCreate method
pauseRefresh = new Runnable() {
@Override
public void run() {
// Check if media is playing to prevent race conditions
if (!isPlaying()) {
startForeground(FOREGROUND_SERVICE, notification);
demoteNotifyBar();
handler.postDelayed(pauseRefresh, 1000);
}
}
};

// Call this wherever you're handling the pause button
pauseRefresh.run();

要取消自动刷新,您需要在重新制作通知栏并将媒体从暂停切换到播放之前调用这段代码(是的,您可以忽略它来切换音频,但请阅读下文了解原因这是需要的):

handler.removeCallbacks(pauseRefresh);

您还需要监听带有删除 Intent 的滑动关闭,以防止通知在用户关闭时重新生成;只需使用相同的代码来取消用户单击播放时使用的计时器。

关于android - 如何在 Spotify 和 Google Music 等后台播放音乐时关闭通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53502244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com