在Spotify和Google Music等后台播放音乐时如何取消通知

时间:2018-11-27 14:48:22

标签: android android-service android-notifications foreground-service

Spotify和Google Music允许用户在后台播放音乐,也可以取消媒体通知。 将这些应用程序之一移至后台,然后暂停播放时,便可以关闭媒体通知。但是,如果您不关闭通知,则将其长时间置于暂停状态,系统将不会终止“音频服务”,因为通知始终可见,并会立即对播放/暂停做出反应。

据我所知,无法使用前台服务来关闭通知,我们需要调用stopForeground(false),这将使系统终止该服务。

这是我们现在在应用程序中的操作方式:

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

startForeground(mediaNotification)

然后,当用户离开应用程序时,他可以通过媒体通知控制播放。由于通知与MusicService紧密相关,因此用户只有在我们致电之前才能将其关闭:

stopForeground(false)

这就是为什么我们在用户按下暂停按钮时调用此方法的原因。 但是,这构成了服务背景,因此系统会在短时间内将其杀死。

Spotify和Google音乐如何解决?实现它的方法是什么?

5 个答案:

答案 0 :(得分:1)

我认为您的服务中可以有一个计时器,如果用户停止了音乐,则计时器会在一段时间后重新启动服务,这样您的计时器就不会死了,并且如果用户单击播放按钮,则可以像以前一样操作。

答案 1 :(得分:0)

因此,当另一个应用程序正在播放他们的音乐时,您希望您的通知可取消。 您需要做的是在创建通知时(我猜是在Mediaprepare()中单击还是单击或其他方式),在创建通知时设置builder.setOngoing(true),以及当用户暂停音乐或其他应用程序使用媒体服务时,设置builder.setOngoing(false),以便用户可以轻松关闭您的通知。

快乐编码

答案 2 :(得分:0)

结合使用Pouya的答案和一些独立研究,我得到了一个代码段,其行为与使用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);

您还需要侦听具有删除意图的刷卡关闭,以防止在用户关闭通知时重新生成通知;只需使用相同的代码即可取消用户点击播放时使用的计时器。

答案 3 :(得分:0)

您尝试使用

NotificationCompat.Builder()
...
.setOngoing(true)
...
.build()

应该做到这一点。

实际上,您不需要停止前台。只需使用此设置。当您要更改此设置时-只需使用正在进行的== false构建新的Notification,然后按以下方式调用即可:

notificationManager.notify( id, yourNotification )

答案 4 :(得分:0)

我已经尝试将标志 STOP_FOREGROUND_DETACH 用于 stopForeground() 并且它似乎有效,允许在一段时间后不清除操作系统的通知的同时滑动通知。