如何在Spotify和Google Music等背景音乐中播放音乐时,如何通知

问题描述 投票:1回答:3

Spotify和Google Music允许用户在后台播放音乐,同时允许媒体通知被拒绝。当您将其中一个应用程序移动到后台,然后暂停播放时,您可以关闭媒体通知。但是,如果您不解除通知,因此它会长时间处于暂停状态,系统将不会终止“音频服务”,因为通知始终可见并立即响应播放/暂停。

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

以下是我们现在在我们的应用程序中执行的操作:

当开始播放时,我们将MusicService作为前台服务运行,其代码如下:

startForeground(mediaNotification)

然后,当用户离开应用程序时,他能够通过媒体通知控制播放。由于通知与MusicService紧密结合,因此在我们致电之前,用户将无法解除通知:

stopForeground(false)

这就是我们在用户按下暂停按钮时调用此方法的原因。然而,这使得服务背景,因此系统将在短时间内杀死它。

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

android android-service android-notifications foreground-service
3个回答
1
投票

我认为你的服务中有一个计时器可以在一段时间后重新启动你的服务,如果用户停止了音乐你的计时器将使它免于死亡,如果用户点击播放按钮就像你之前做的那样。


0
投票

所以你想要另一个应用程序正在播放他们的音乐,你希望你的通知不被允许。你需要做的是当你创建通知时(我想在Mediaprepare()或点击或其他),当你创建通知你设置builder.setOngoing(true),当你用户暂停音乐或其他应用程序时使用媒体服务你设置builder.setOngoing(false),以便用户可以轻松地关闭您的通知。

快乐的编码


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);

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

© www.soinside.com 2019 - 2024. All rights reserved.