由于android.app.ForegroundServiceStartNotAllowedException,startForegroundService()不允许使用,因为mAllowStartForeground为false。

3
我已将 Android SDK 项目从 30 升级到 31。同时,我正在使用Android Beacon Library扫描 iBeacon。 在 Android 12 上,当应用程序处于 100% 后台状态时,我经常遇到以下崩溃问题:

Caused by android.app.ForegroundServiceStartNotAllowedException: startForegroundService() not allowed due to mAllowStartForeground false: service com.beacon.android/org.altbeacon.beacon.service.BeaconService at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:54) at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:50) at android.os.Parcel.readParcelable(Parcel.java:3345) at android.os.Parcel.createExceptionOrNull(Parcel.java:2432) at android.os.Parcel.createException(Parcel.java:2421) at android.os.Parcel.readException(Parcel.java:2404) at android.os.Parcel.readException(Parcel.java:2346) at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6897) at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1926) at android.app.ContextImpl.startForegroundService(ContextImpl.java:1892) at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:796) at org.altbeacon.beacon.BeaconManager.bindInternal(BeaconManager.java:438) at org.altbeacon.beacon.BeaconManager.autoBind(BeaconManager.java:1810) at org.altbeacon.beacon.BeaconManager.startMonitoring(BeaconManager.java:1136) at com.beacon.BeaconApplication.onCreate(BeaconApplication.kt:170) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1211) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7429) at android.app.ActivityThread.access$1700(ActivityThread.java:309) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2268) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8582) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:563) at 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,链接如下:https://github.com/davidgyoung/android-beacon-library-reference-kotlin/tree/android-12 请尝试使用此分支,并查看其是否适用于您,如果可以,请检查您设置代码和参考应用程序中的设置代码之间的差异。如果您无法通过此方法找到问题,则请发布您的设置代码。 - davidgyoung
1
请确保您的清单文件中包含以下权限:<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>。这是针对SDK 28及以上版本的必需权限。 - davidgyoung
@davidgyoung 感谢您的快速回复。 我已经添加了权限和<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>。此外,我将参考android-beacon-library-reference-kotlin示例应用程序并监视2-3天,然后告诉您。 - Nitin Karande
@davidgyoung,我们在 https://github.com/davidgyoung/android-beacon-library-reference-kotlin/tree/android-12 这个项目上遇到了问题,请问您能否建议我们如何解决这个问题。 - Nitin Karande
请注意,Android Beacon Library已进行了更新以解决此问题。请查看我的答案获取详细信息。 - davidgyoung
1个回答

1

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

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

有关使用前台服务的更大问题的讨论,请参见此处


我确定这是 Android 中的一个错误。此处列出的“非常特定的情况”(https://developer.android.com/guide/components/foreground-services#background-start-restriction-exemptions)提供了豁免,允许从后台启动前台服务,但它们被忽略了。例如,“您的应用程序接收到需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。” - 这不是你的库的一个功能吗?Google 看起来正在研究此问题:https://issuetracker.google.com/issues/229000935 - warbi
问题在于该库在前台服务内部启动蓝牙扫描,而此时还没有检测到任何设备。这在 Android 8-11 上运行良好,但在后台模式下不再适用。您可能希望讨论如何在上述库问题链接中进行更改。 - davidgyoung

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