【问题标题】:Caused by android.app.ForegroundServiceStartNotAllowedException startForegroundService() not allowed due to mAllowStartForeground false由 android.app.ForegroundServiceStartNotAllowedException startForegroundService() 引起,由于 mAllowStartForeground false 不允许
【发布时间】:2022-06-26 06:57:17
【问题描述】:

我已将 Android SDK 项目 30 升级到 31。我还使用Android Beacon Library 扫描 iBeacon。

Android 12 在 100% 后台应用程序上经常出现以下崩溃。

由 android.app.ForegroundServiceStartNotAllowedException 引起:由于 mAllowStartForeground 不允许 startForegroundService() 错误:服务 com.beacon.android/org.altbeacon.beacon.service.BeaconService 在 android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:54) 在 android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:50) 在 android.os.Parcel.readParcelable(Parcel.java:3345) 在 android.os.Parcel.createExceptionOrNull(Parcel.java:2432) 在 android.os.Parcel.createException(Parcel.java:2421) 在 android.os.Parcel.readException(Parcel.java:2404) 在 android.os.Parcel.readException(Parcel.java:2346) 在 android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6897) 在 android.app.ContextImpl.startServiceCommon(ContextImpl.java:1926) 在 android.app.ContextImpl.startForegroundService(ContextImpl.java:1892) 在 android.content.ContextWrapper.startForegroundService(ContextWrapper.java:796) 在 org.altbeacon.beacon.BeaconManager.bindInternal(BeaconManager.java:438) 在 org.altbeacon.beacon.BeaconManager.autoBind(BeaconManager.java:1810) 在 org.altbeacon.beacon.BeaconManager.startMonitoring(BeaconManager.java:1136) 在 com.beacon.BeaconApplication.onCreate(BeaconApplication.kt:170) 在 android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1211) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:7429) 在 android.app.ActivityThread.access$1700(ActivityThread.java:309) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2268) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loopOnce(Looper.java:226) 在 android.os.Looper.loop(Looper.java:313) 在 android.app.ActivityThread.main(ActivityThread.java:8582) 在 java.lang.reflect.Method.invoke(Method.java) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:563) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)

目前使用低于版本的 Altbeacon 库

implementation 'org.altbeacon:android-beacon-library:2.19.3'

此外,在 Android SDK 版本 30 以下,它的工作绝对正常。

提前致谢!

【问题讨论】:

  • 我无法使用官方 Kotlin 参考应用程序重现这些结果。请在此处查看我针对 SDK 31 创建的分支:github.com/davidgyoung/android-beacon-library-reference-kotlin/… 请尝试此分支,看看它是否适合您,如果适合,请检查您的设置代码与参考应用程序中的设置代码之间的差异。如果您无法通过这种方式找到问题,请发布您的设置代码。
  • 请检查您的清单中是否有此权限:<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>。这是面向 SDK 28 及更高版本所必需的
  • @davidgyoung 感谢您的快速回复。我已经添加了权限和 。另外,我会参考 android-beacon-library-reference-kotlin 示例应用程序和监控 2-3 天,并让您知道。
  • @davidgyoung 我们在github.com/davidgyoung/android-beacon-library-reference-kotlin/…这个项目上遇到了问题,请你建议我们如何解决这个问题。

标签: android kotlin bluetooth altbeacon startforegroundservice


【解决方案1】:

这是由 Android 12 的安全更改引起的。对于面向 SDK 31 的应用,Android 12 现在会阻止启动前台服务,除非在非常特殊的情况下。通常,您的应用必须在屏幕上可见启动前台服务。

Android Beacon 库中特定问题的解决方案已在后续库版本中发布。请参阅here 讨论的解决方案。

在这里查看discussion of the bigger picture issue of using Foreground Services

【讨论】:

  • 我确定这是 Android 中的一个错误。此处列出的“非常具体的情况”developer.android.com/guide/components/… 提供了允许从后台启动前台服务的例外情况,但是它们被忽略了。例如,“您的应用收到需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。” - 这不是您图书馆的功能之一吗?谷歌似乎正在调查它:issuetracker.google.com/issues/229000935
  • 问题是库在检测到之前就从前台服务内部启动了蓝牙扫描。这在 Android 8-11 上运行良好,但不再适用(无论如何在后台)。您可能希望在上面的库问题链接中讨论如何更改。
猜你喜欢
  • 2022-10-20
  • 2014-02-18
  • 2016-10-03
  • 2015-09-06
  • 1970-01-01
  • 2016-03-29
  • 2018-10-04
  • 2018-03-28
  • 1970-01-01
相关资源
最近更新 更多