不允许启动服务
Not allowed to start service
我正在开发一个也集成了 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。
我读过 Background Execution Limits in 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);
基本上,单击按钮会打开系统对话框,您可以在其中 select 设备。当你 select 一个设备时,回调被调用,我正在使用 RemoteMediaClient class.
的 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)。
知道在什么情况下会发生这种情况以及如何解决吗?
谢谢!
我在我的应用程序中遇到了同样的问题,使用相同的转换框架版本。查看 Google 发行说明,更新到 16.0.1 可能会解决它:
Cast
Fixed an IllegalStateException which happens when a seek request times out in RemoteMediaPlayer and RemoteMediaClient. This is a regression introduced in 15.0.0. Clients should update to 16.0.1 or newer to get the fix.
我正在开发一个也集成了 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。
我读过 Background Execution Limits in 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);
基本上,单击按钮会打开系统对话框,您可以在其中 select 设备。当你 select 一个设备时,回调被调用,我正在使用 RemoteMediaClient class.
的 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)。
知道在什么情况下会发生这种情况以及如何解决吗?
谢谢!
我在我的应用程序中遇到了同样的问题,使用相同的转换框架版本。查看 Google 发行说明,更新到 16.0.1 可能会解决它:
Cast
Fixed an IllegalStateException which happens when a seek request times out in RemoteMediaPlayer and RemoteMediaClient. This is a regression introduced in 15.0.0. Clients should update to 16.0.1 or newer to get the fix.