权限拒绝:startForeground需要android.permission.FOREGROUND_SERVICE。

249

最近我们突然看到了以下一些堆栈跟踪。为什么会这样呢?这是在应用程序尝试通过媒体通知将音频评论服务移动到前台时发生的。

java.lang.SecurityException: Permission Denial: startForeground from pid=1824, uid=10479 requires android.permission.FOREGROUND_SERVICE
    at android.os.Parcel.createException(Parcel.java:1942)
    at android.os.Parcel.readException(Parcel.java:1910)
    at android.os.Parcel.readException(Parcel.java:1860)
    at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5198)
    at android.app.Service.startForeground(Service.java:695)
    at com.example.app.services.AudioService.setUpMediaNotification(AudioService.java:372)
    at com.example.app.services.AudioService.setUpAndStartAudioFeed(AudioService.java:328)
    at com.example.app.services.AudioService.onStartCommand(AudioService.java:228)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3667)
    at android.app.ActivityThread.access$1600(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:9186)
    at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1189)
    at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:870)
    at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:20434)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:976)
5个回答

504
如果您设置了targetSdkVersion = 28 (Android 9 / Pie)或更高版本,并且未声明使用FOREGROUND_SERVICE权限,则会发生这种情况。
根据Android 9的迁移说明
应用程序想要使用前台服务现在必须首先请求FOREGROUND_SERVICE权限。 这是一个正常的权限,因此系统会自动将其授予请求的应用程序。 没有权限启动前台服务会抛出SecurityException。
解决方案是在AndroidManifest.xml中添加以下内容:
<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

8
这是否意味着,如果我们的 targetSdkVersion 低于28,在运行 Android 28 的设备上运行前台服务时就不需要获取任何权限? - user6274128
3
听起来这个解决方案对我来说有点奇怪,就是降低targetSdkVersion。 - Denny
2
@Sjd它们会安装得很好。这不像是“maxSdkVersion”。 - Roy Solberg
13
给你点赞,但版本说明不是建立不兼容 API 的借口。在这种情况下,Google 可以要求用户授权,或者至少提供提示,而不是默默地崩溃应用程序。最近 Android 变得非常难以维护。 - Oleg Gryb
2
如果您在Android Studio中打开AndroidManifest.xml,您可以选择查看“合并清单”。也许有一个依赖关系会为您注入该权限使用? - Roy Solberg
显示剩余9条评论

51

权限拒绝:startForeground需要android.permission.FOREGROUND_SERVICE

针对 Android 9(API 级别 28)或更高版本并使用前台服务的应用程序必须请求FOREGROUND_SERVICE 权限。

因此,我们现在需要在清单文件中添加前台服务权限

  • 它允许常规应用程序使用Service.startForeground

SAMPLE

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

FOREGROUND_SERVICE是一个普通权限,因此系统会自动授予请求该权限的应用程序。

请查看Android 9 / Pie的迁移说明

  • 更改

前台服务权限

  • 摘要

想要使用前台服务的应用现在必须先请求FOREGROUND_SERVICE权限。这是一个普通权限,因此系统会自动授予请求该权限的应用程序。未经许可启动前台服务会引发SecurityException。

还需阅读startForeground()

  • 针对API Build.VERSION_CODES.P或更高版本的应用程序必须请求权限Manifest.permission.FOREGROUND_SERVICE以使用此API。

先生,我尝试了您的解决方案,但在所有安卓设备上都无法正常工作。例如,在Oppo F11 Pro上可以运行,但在三星、诺基亚和小米手机上应用程序会崩溃,并在日志中出现相同的错误。您能告诉我如何修复吗? - Kapil Soni
@Kapilsoni,日志里出现了相同的错误,请问你遇到了什么错误? - AskNilesh
我收到了这个错误信息:“android.app.RemoteServiceException: Bad notification for startForeground:” - Kapil Soni
1
@Kapilsoni 我知道这是一个旧帖子,但你尝试重新安装了吗?有时候重新安装可以解决问题,例如通知渠道的重要性更改。 - Samuel T. Chou

22

注意到 FOREGROUND_SERVICE 不需要运行时权限要求,只需将以下内容添加到清单中

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<application之前添加上述行。


它实际上需要显示通知,因此需要通知运行时权限。 - undefined

15

对于API级别28或更高版本,需要FOREGROUND_SERVICE权限。否则,它将无法运行并抛出异常。

通过添加

来解决此问题。

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
在AndroidManifest.xml文件中。

2
我已经添加了,但对我来说还没有修复。 - Kapil Soni
@Kapilsoni 我也遇到了同样的问题,已经添加了权限但仍然因API 29权限不足而崩溃,你解决了吗? - ArturM

6

从2019年11月1日起,Google Play商店中的应用更新将强制使用至少28targetSdkVersion。因此,您需要更改目标API,然后请求权限FOREGROUND_SERVICE以避免在startForeground()上崩溃。


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