代码之家  ›  专栏  ›  技术社区  ›  Roy Solberg

拒绝权限:StartForeground需要android.permission.foreground\u服务

  •  68
  • Roy Solberg  · 技术社区  · 6 年前

    最近,我们突然看到了以下几个堆栈跟踪。为什么会这样?这是从应用程序试图将音频评论服务与媒体通知一起移动到前台开始的。

    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)
    
    2 回复  |  直到 6 年前
        1
  •  143
  •   Roy Solberg    6 年前

    这是因为您没有正确阅读发行说明。这是在设置时开始的 targetSdkVersion = 28 (android 9/pie)并在例如 the migration notes :

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

    所以 解决方案是在 AndroidManifest.xml :

    <manifest ...>
         ...
         <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
         ...
         <application ...>
         ...
    </manifest>
    
        2
  •  13
  •   AskNilesh    6 年前

    拒绝权限:StartForeground需要android.permission.foreground\u服务

    针对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

    • 变化

    前台服务权限

    • 总结

    想要使用前台服务的应用程序现在必须先请求前台服务权限。这是一个正常的权限,因此系统自动将其授予请求应用程序。在没有权限的情况下启动前台服务会引发SecurityException。

    也读 startForeground()

    • 应用程序目标API Build.VERSION_CODES.P 或以后必须请求权限 Manifest.permission.FOREGROUND_SERVICE 为了使用这个API。