不允许启动服务。

6

我正在开发一个流媒体应用程序,并且还集成了Chromecast。 根据我的Crashlytics控制台,有很多用户遇到以下崩溃:

Fatal Exception: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.android.gms.cast.framework.action.UPDATE_NOTIFICATION pkg=com.package.name cmp=com.package.name/com.google.android.gms.cast.framework.media.MediaNotificationService (has extras) }: app is in background uid UidRecord{4ee441 u0a213 CAC  bg:+11m25s10ms idle procs:1 seq(0,0,0)}
       at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1538)
       at android.app.ContextImpl.startService(ContextImpl.java:1484)
       at android.content.ContextWrapper.startService(ContextWrapper.java:663)
       at com.google.android.gms.internal.cast.zzai.zzg(Unknown Source:269)
       at com.google.android.gms.internal.cast.zzai.onStatusUpdated(Unknown Source:1)
       at com.google.android.gms.cast.framework.media.zzr.onStatusUpdated(Unknown Source:30)
       at com.google.android.gms.internal.cast.zzdh.onStatusUpdated(Unknown Source:6)
       at com.google.android.gms.internal.cast.zzdh.zzn(Unknown Source:573)
       at com.google.android.gms.cast.framework.media.RemoteMediaClient.onMessageReceived(Unknown Source:2)
       at com.google.android.gms.internal.cast.zzct.run(Unknown Source:34)
       at android.os.Handler.handleCallback(Handler.java:789)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6938)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
  • 目前我还无法复制它,这就是为什么我在这里发布的原因。 看起来Chromecast设备在后台运行时尝试通知我的应用程序有关某些内容。

  • 所有崩溃仅出现在Oreo上,并且只有在应用程序在后台运行时才会出现。

  • 在几个版本之前没有此崩溃,并且我一段时间内没有更改过Chromecast代码,所以我有一种感觉,它的原因是在我的build.gradle文件中更新了某些依赖项。

  • 有几个崩溃组具有相同的原因和堆栈跟踪,但每个组都有不同的UidRecord。

  • 我已经阅读了有关Oreo的后台执行限制,但这似乎超出了我的能力范围,因为我自己没有触及任何服务。

由于我需要一个定制的外观按钮,这是我集成Chromecast功能的方式:

<android.support.v7.app.MediaRouteButton
android:id="@+id/btn_cast".../>
...
CastButtonFactory.setUpMediaRouteButton(context, binding.btnCast);
binding.btnCast.setRemoteIndicatorDrawable(ContextCompat.getDrawable(context, R.drawable.ic_control_bar_cast));
...
CastContext castContext = CastContext.getSharedInstance(context);
castContext.addCastStateListener(this);
...
@Override
public void onCastStateChanged(int state) {
    switch (state) {
        case CastState.CONNECTED:
        ...
    }
}
...
CastSession currentCastSession = castContext.getSessionManager().getCurrentCastSession();
...
RemoteMediaClient remoteMediaClient = currentCastSession.getRemoteMediaClient();
...
remoteMediaClient.load(mediaInfo, mediaLoadOptions);

基本上,点击按钮会打开系统对话框,您可以在其中选择设备。当您选择设备时,回调函数将被调用,并且我将使用RemoteMediaClient类的load()方法发送要播放的数据。
我的依赖项如下:
implementation 'com.android.support:mediarouter-v7:27.1.1'
implementation 'com.google.android.gms:play-services-cast-framework:15.0.1'

我已经多次更新这些库,希望问题能够消失(我认为问题开始于版本27.0.2和11.8.0之间的某个时候)。

你有什么想法是什么原因导致这个问题,在什么条件下以及如何解决它?

谢谢!


这里也有同样的问题。你解决了这个问题吗? - Bartosz Wilk
@BartoszWilk 哦,原来不只有我一个人遇到这个问题!不幸的是,我还没有找到解决方法。 - Edward
你找到解决方法了吗? - casolorz
1个回答

6
我在我的应用程序中遇到了相同的问题,使用相同的投射框架版本。查看Google发布说明,更新到16.0.1可能会解决这个问题:

投射

修复了在RemoteMediaPlayer和RemoteMediaClient中超时的搜索请求导致IllegalStateException的问题。这是在15.0.0中引入的回归。客户端应该更新到16.0.1或更高版本以获得修复。

https://developers.google.com/android/guides/releases


1
我觉得你是对的,更新后我的日志中再也没有崩溃的记录了。 但是我不认为这个错误是在15.0.0版本引入的。就像我说的,对于我来说,它始于11.8.0版本的某个地方。 - Edward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接