FeeeeeLog

Android 9 でFOREGROUND_SERVICEがSecurityExceptionを投げる

   

Android 9 でフォアグラウンドサービスの起動時に新しくノーマルパーミッションが必要になりました。

こんな例外が発生する場合の対処方法を説明します。

08-18 07:32:11.460 8191-8191/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: net.feel_log.volume:service, PID: 8191
    java.lang.RuntimeException: Unable to start service net.feel_log.volume.VolumeService@720656a with Intent { cmp=net.feel_log.volume/.VolumeService }: java.lang.SecurityException: Permission Denial: startForeground from pid=8191, uid=10085 requires android.permission.FOREGROUND_SERVICE
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3686)
        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: java.lang.SecurityException: Permission Denial: startForeground from pid=8191, uid=10085 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 net.feel_log.volume.NotificationController.<init>(NotificationController.java:225)
        at net.feel_log.volume.VolumeService.onStartCommand(VolumeService.java:236)
        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) 

スポンサーリンク

もくじ

フォアグラウンドサービスの例外をなくす設定

フォアグラウンドサービスに記載されている通り、Android 9 からはNormal パーミッションの FOREGROUND_SERVICE パーミッションをリクエストしてください。
そうしないと SecurityException 例外を投げます。

Manifest.xml で FOREGROUND_SERVICE パーミッションをリクエスト

Normal パーミッションなので、ユーザーの許可が不要です。

AndroidManifest.xml に次のように追記してください。

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

これでリクエストが完了し、例外が発生しなくなります。