MediaBrowserServiceCompat 中的 Service.startForeground()

Posted

技术标签:

【中文标题】MediaBrowserServiceCompat 中的 Service.startForeground()【英文标题】:Service.startForeground() in MediaBrowserServiceCompat 【发布时间】:2018-08-31 17:36:27 【问题描述】:

我在 android Dashboard 崩溃日志中看到了这个错误:

Context.startForegroundService() 没有调用 Service.startForeground()(没有可用的位置)

我了解 Oreo 中引入的背景限制,并已阅读 this post。

但是,对于运行 Android Wear 8.0 的一小部分用户,我仍然收到此错误消息。令人困惑的是,并非所有用户都在运行 8.0。

根据文档,如果您调用 Context.startForgroundService(),则必须在 5 秒内通过在服务中调用 startForeground() 来显示通知(我假设 MediaBrowserCompat 正在调用 Context.startForgroundService())。

但是,如果我使用的是MediaBrowserServiceCompat,我不确定是否需要这样做。当用户点击播放开始音频播放时,我确实会显示前台通知。

public class MediaActivity 

    private MediaBrowserCompat mMediaBrowserCompat;

    @Override
    public void onCreate() 
        super.onCreate(savedInstanceState);

        mMediaBrowserCompat = new MediaBrowserCompat(
                this,
                new ComponentName(this, MediaPlayerService.class),
                mMediaBrowserCompatConnectionCallback,
                getIntent().getExtras()
        );

        mMediaBrowserCompat.connect();     
    


private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() 

    @Override
    public void onConnected() 
        super.onConnected();
        final MediaControllerCompat mcc = new MediaControllerCompat(MediaActivity.this, mMediaBrowserCompat.getSessionToken());
        mcc.registerCallback(mMediaControllerCompatCallback);
        MediaControllerCompat.setMediaController(mActivity, mcc);
    
;

public class MediaPlayerService extends MediaBrowserServiceCompat 
    @Override
    public void onCreate() 
        super.onCreate();

        //Should I add a startForeground notification here

    


private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() 
    @Override
    public void onPlay() 
        super.onPlay();

        final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID)

        ...
        startForeground(101, builder.build());
    

    @Override
    public void onPause() 
        super.onPause();
    
;

【问题讨论】:

我在 Google Dashboard 中报告了同样的问题。与@Stephen Kennedy 所理解的相反,我们不能调用 startForegroundService,因为该服务是由 MediaBrowser 触发和启动的。在这一点上,我认为这是 Android 的一个错误,我们必须忍受它。 是的,我知道我不应该在 MediaService 中调用 Service.startForeground()。 issuetracker 中有一个似乎与此相关的错误:issuetracker.google.com/issues/76112072 【参考方案1】:

如果您正在运行音频 mediaCompact 服务,则必须在调用 startforeground 之前使用 startForegroundService 附加前台通知,由于后台限制,这不会被系统破坏。

【讨论】:

这在developer.android.com/guide/topics/media-apps/audio-app/… 页面中有解释。这是一段: 媒体会话 onPlay() 回调应包括调用 startService() 的代码。这可确保服务启动并继续运行,即使绑定到它的所有 UI MediaBrowser 活动都解除绑定。

以上是关于MediaBrowserServiceCompat 中的 Service.startForeground()的主要内容,如果未能解决你的问题,请参考以下文章

MediaBrowserServiceCompat 的 onGetroot() 方法的返回类型?

MediaBrowserServiceCompat 中的 Service.startForeground()

当应用程序进入后台时,MediaBrowserServiceCompat 停止播放音乐

onLoadChildren 在 MediaBrowserServiceCompat 服务上发送了 id root 的空列表

如何更改 Android MediaBrowserServiceCompat 中的媒体项目

前台 MediaBrowserService 在应用退出时被终止