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

时间:2018-09-18 08:56:55

标签: android android-service android-permissions

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

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 个答案:

答案 0 :(得分:190)

这是由于未正确阅读发行说明而获得的。设置targetSdkVersion = 28(Android 9 / Pie)时开始发生这种情况,例如, the migration notes

  

想要使用前台服务的应用程序现在必须请求   首先是FOREGROUND_SERVICE权限。这是正常权限,所以   系统会自动将其授予请求的应用。开始一个   未经许可的前台服务会引发SecurityException。

所以解决方案是仅在AndroidManifest.xml中添加以下内容:

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

答案 1 :(得分:18)

  

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

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

所以现在我们需要在清单文件中添加Foreground service permission

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

示例

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

FOREGROUND_SERVICE是普通权限,因此系统会自动将其授予请求的应用。

Check this the migration notes of Android 9 / Pie

  • 更改
  

前台服务许可

  • 摘要
  

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

也请阅读startForeground()

  • 定位到API Build.VERSION_CODES.P或更高版本的应用程序必须请求权限Manifest.permission.FOREGROUND_SERVICE才能使用此API。

答案 2 :(得分:6)

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

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

以上行应添加到<application

之前

答案 3 :(得分:2)

从2019年11月1日开始,必须强制至少targetSdkVersion的{​​{1}}用于Play商店中的应用更新。因此,您需要更改目标API,然后请求权限28,以避免在FOREGROUND_SERVICE

上崩溃

答案 4 :(得分:0)

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

将通过添加

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

在AndroidManifest.xml文件中。