Penolakan Izin: startForeground membutuhkan android.permission.FOREGROUND_SERVICE

195

Baru-baru ini kita tiba-tiba melihat beberapa jejak tumpukan berikut. Kenapa bisa begitu? Ini sejak aplikasi mencoba memindahkan layanan komentar audio ke latar depan dengan pemberitahuan media dan semuanya.

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)
Roy Solberg
sumber

Jawaban:

413

Ini akan terjadi jika Anda telah menetapkan targetSdkVersion = 28(Android 9 / Pie) atau di atas dan belum menyatakan penggunaan FOREGROUND_SERVICEizin.

Dari catatan migrasi untuk Android 9:

Aplikasi yang ingin menggunakan layanan foreground sekarang harus meminta izin FOREGROUND_SERVICE terlebih dahulu. Ini adalah izin normal, sehingga sistem secara otomatis memberikannya ke aplikasi yang meminta. Memulai layanan latar depan tanpa izin melempar SecurityException.

Solusinya adalah dengan menambahkan yang berikut ini di AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>
Roy Solberg
sumber
8
Apakah itu berarti jika kami targetSdkVersionlebih rendah dari 28, kami tidak memerlukan izin untuk menjalankan layanan Foreground di perangkat yang menjalankan 28?
3
Itu terdengar seperti solusi aneh bagi saya, untuk menurunkan targetSdkVersion
Denny
2
@ Sjd Mereka akan menginstal dengan baik. Tidak seperti itu maxSdkVersion.
Roy Solberg
9
Memutuskan suara jawaban Anda, tetapi catatan rilis bukan alasan untuk membuat API yang kompatibel dengan yang tidak terbelakang. Dalam hal ini Google dapat meminta pengguna untuk memberikan izin atau setidaknya memberikan petunjuk alih-alih menabrak aplikasi secara diam-diam. Android menjadi sangat sulit dipertahankan belakangan ini.
Oleg Gryb
2
@miladsalimi Jika Anda membuka AndroidManifest.xml di Android Studio, Anda dapat memilih untuk melihat "manifes gabungan". Mungkin ada ketergantungan yang menyuntikkan penggunaan izin itu untuk Anda?
Roy Solberg
43

Penolakan Izin: startForeground membutuhkan android.permission.FOREGROUND_SERVICE

Aplikasi yang menargetkan Android 9 (API level 28) atau lebih tinggi dan menggunakan layanan latar depan harus meminta FOREGROUND_SERVICE permission.

Jadi sekarang kita perlu menambahkan izin layanan Foreground dalam file manifes

  • Mengizinkan aplikasi biasa digunakan Service.startForeground

SAMPEL

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

FOREGROUND_SERVICE adalah izin normal, sehingga sistem secara otomatis memberikannya ke aplikasi yang meminta.

Periksa ini catatan migrasi Android 9 / Pie

  • Perubahan

Izin layanan latar depan

  • Ringkasan

Aplikasi yang ingin menggunakan layanan foreground sekarang harus meminta izin FOREGROUND_SERVICE terlebih dahulu. Ini adalah izin normal, sehingga sistem secara otomatis memberikannya ke aplikasi yang meminta. Memulai layanan latar depan tanpa izin melempar SecurityException.

Baca juga startForeground()

  • API penargetan aplikasi Build.VERSION_CODES.Patau yang lebih baru harus meminta izin Manifest.permission.FOREGROUND_SERVICEuntuk menggunakan API ini.
Nilesh Rathod
sumber
Pak saya mencoba solusi Anda tetapi itu tidak bekerja untuk saya untuk semua perangkat android. seperti di Oppo F11 Pro bekerja tetapi di Samsung, aplikasi ponsel Nokia dan Mi jatuh dan mendapat kesalahan yang sama di log. Dapatkah Anda memberi tahu saya apa yang saya lakukan untuk memperbaiki?
Kapil soni
@Kapilsoni `mendapat kesalahan yang sama di log` kesalahan apa yang Anda dapatkan
Nilesh Rathod
saya mendapatkan kesalahan ini "android.app.RemoteServiceException: Notifikasi buruk untuk startForeground:"
Kapil soni
8

Untuk API level 28 atau lebih tinggi, itu memerlukan izin FOREGROUND_SERVICE. Kalau tidak, itu tidak bisa berjalan dan mendapat pengecualian.

Ini akan diselesaikan dengan menambahkan

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

dalam file AndroidManifest.xml.

Zaman
sumber
saya telah menambahkan tetapi tidak memperbaiki untuk saya
Kapil soni
@Kapilsoni masalah yang sama bagi saya, ditambahkan tetapi masih macet karena izin API 29 tidak mencukupi, apakah Anda berhasil menyelesaikannya?
ArturM
4

Sebuah targetSdkVersionminimal 28akan wajib dari 1 Nov 2019 untuk pembaruan aplikasi di Play Store. Jadi, Anda harus mengubah API target, dan kemudian meminta izin FOREGROUND_SERVICEuntuk menghindari crashstartForeground()

Hermano Mclintock
sumber
0

Memperhatikan bahwa FOREGROUND_SERVICEtidak memerlukan persyaratan izin runtime. hanya tambahkan di bawah ini ke Manifes

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

baris di atas harus ditambahkan sebelumnya <application

Atef Farouk
sumber