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

Posted

技术标签:

【中文标题】权限拒绝:startForeground 需要 android.permission.FOREGROUND_SERVICE【英文标题】:Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE 【发布时间】:2019-02-22 06:17:09 【问题描述】:

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

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)

【问题讨论】:

【参考方案1】:

如果您设置了targetSdkVersion = 28(Android 9 / Pie)或更高版本并且没有声明使用FOREGROUND_SERVICE权限,则会发生这种情况。

来自the migration notes,适用于 Android 9:

想要使用前台服务的应用现在必须请求 FOREGROUND_SERVICE 权限优先。这是一个正常的权限,所以 系统会自动将其授予请求的应用程序。开始一个 没有权限的前台服务抛出SecurityException。

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

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

【讨论】:

这是否意味着如果我们的targetSdkVersion 低于28,我们不需要任何权限就可以在运行28 的设备上运行前台服务? 这对我来说听起来像是一个奇怪的解决方案,降低 targetSdkVersion @Sjd 他们会安装得很好。不像是maxSdkVersion 支持您的答案,但发行说明并不是构建非向后兼容 API 的借口。在这种情况下,谷歌本可以要求用户给予许可或至少提供一个提示,而不是让应用程序静默崩溃。 Android 最近变得非常难以维护。 @miladsalimi 如果您在 Android Studio 中打开 AndroidManifest.xml,您可以选择查看“合并清单”。也许有一个依赖项为您注入了该权限使用?【参考方案2】:

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

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

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

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

【讨论】:

先生,我尝试了您的解决方案,但它不适用于所有 android 设备。就像在 Oppo F11 Pro 中它工作但在三星、诺基亚和 Mi 手机应用程序中崩溃并在日志中出现相同的错误。你能告诉我我要做什么来修复吗? @Kapilsoni ` got the same error in log` 你得到什么错误 我收到此错误“android.app.RemoteServiceException:startForeground 的错误通知:” @Kapilsoni 我知道这是一篇旧帖子,但是您是否尝试过重新安装...?有时重新安装可以解决问题,例如通知渠道的重要性更改。【参考方案3】:

注意FOREGROUND_SERVICE 不需要运行时权限要求。仅在清单下方添加

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

以上行应加在&lt;application之前

【讨论】:

【参考方案4】:

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

添加即可解决

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

在 AndroidManifest.xml 文件中。

【讨论】:

我已添加但未修复 @Kapilsoni 对我来说同样的问题,添加但由于 API 29 权限不足仍然崩溃,你设法解决了吗?【参考方案5】:

从 2019 年 11 月 1 日起,必须至少有一个 targetSdkVersion28 才能在 Play 商店中更新应用。因此,您需要更改目标 API,然后请求权限 FOREGROUND_SERVICE 以避免在 startForeground() 上崩溃

【讨论】:

以上是关于权限拒绝:startForeground 需要 android.permission.FOREGROUND_SERVICE的主要内容,如果未能解决你的问题,请参考以下文章

startForeground() 不显示我的通知

安好iis后 显示网站拒绝访问此网页,需要登录

呼叫需要权限,用户在尝试获取位置时可能会拒绝该权限

Java Android调用需要权限,用户可能会拒绝[重复]

查找中的权限被拒绝:为啥我们需要 2>&1?

#1227 - 访问被拒绝;您需要此操作的 SUPER 权限 - 如何解决?