权限拒绝:start前台需要android.permission.FOREGROUND_SERVICE

最近,我们突然看到了以下几个堆栈痕迹。为什么会这样呢?这是从应用程序试图移动音频评论服务到前景与媒体通知和一切。

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)
105790 次浏览

如果你已经设置了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>

权限拒绝:start前台需要android.permission.FOREGROUND_SERVICE

以Android 9 (API级别28)或更高版本为目标并使用前台服务的应用程序必须请求FOREGROUND_SERVICE permission

所以现在我们需要在manifest文件中添加前台业务权限

  • 它允许常规应用程序使用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。

对于API级别28或更高,它需要FOREGROUND_SERVICE权限。否则,它不能运行,并得到一个异常。

用加法来解

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

在AndroidManifest.xml文件。

从2019年11月1日起,Play Store中的应用程序更新将强制要求至少28targetSdkVersion。所以你需要改变目标API,然后请求权限FOREGROUND_SERVICE以避免在startForeground()上崩溃

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

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

上面的行应该添加在<application之前