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


193

最近,我们突然看到了以下一些堆栈跟踪。为什么会这样呢?这是从应用程序尝试通过媒体通知和所有内容将音频评论服务移至前台时开始的。

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)

Answers:


411

如果您已设置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,则不需要任何许可即可在运行28的设备中运行Foreground服务?

3
对我来说,这听起来像是一个怪异的解决方案,以降低targetSdkVersion
Denny

2
@Sjd他们会安装就好。它不像是maxSdkVersion
罗伊·索尔伯格

9
投票赞成您的答案,但发行说明不是构建非向后兼容API的借口。在这种情况下,Google可能会要求用户给予许可或至少提供提示,而不是使应用程序无声崩溃。Android最近变得很难维护。
奥列格里布

2
@miladsalimi如果您在Android Studio中打开AndroidManifest.xml,则可以选择查看“合并清单”。也许有一个依赖项可以为您注入权限使用情况?
罗伊·索尔伯格

43

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

面向Android 9(API级别28)或更高版本并使用前台服务的应用必须请求FOREGROUND_SERVICE permission

所以现在我们需要在清单文件中添加Foreground服务权限

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

样品

<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。

先生,我尝试了您的解决方案,但不适用于所有android设备。例如在Oppo F11 Pro中可以正常工作,但在Samsung,Nokia和Mi手机应用程序崩溃了,并在log中出现了相同的错误。您能告诉我我该怎么做吗固定?
卡皮尔索尼

@Kapilsoni`在日志中遇到了相同的错误`您正在得到什么错误
Nilesh Rathod

我收到此错误“ android.app.RemoteServiceException:startForeground的错误通知:”
Kapil

8

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

这将通过添加解决

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

在AndroidManifest.xml文件中。


我已添加但不固定
Kapil soni

@Kapilsoni对我来说是同样的问题,已添加,但由于对API 29的权限不足而仍然崩溃,您设法解决了吗?
ArturM

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.