【问题标题】:Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE权限拒绝:startForeground 需要 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)

【问题讨论】:

    标签: android android-service android-permissions


    【解决方案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() 上崩溃

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多