การปฏิเสธสิทธิ์: startForeground ต้องใช้ android.permission.FOREGROUND_SERVICE


195

เมื่อเร็ว ๆ นี้เราได้เห็นร่องรอยสแต็คต่อไปนี้สองสามข้อ ทำไมถึงเป็นเช่นนั้น? สิ่งนี้มาจากเมื่อแอปพลิเคชันพยายามย้ายบริการวิจารณ์เสียงไปยังเบื้องหน้าด้วยการแจ้งเตือนสื่อและทุกสิ่ง

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)

คำตอบ:


413

สิ่งนี้จะเกิดขึ้นหากคุณตั้งค่าtargetSdkVersion = 28(Android 9 / Pie) ขึ้นไปและยังไม่ได้ประกาศการใช้งานFOREGROUND_SERVICEสิทธิ์

จากบันทึกการย้ายข้อมูลสำหรับ Android 9:

แอปที่ต้องการใช้บริการเบื้องหน้าต้องขอสิทธิ์จาก FOREGROUND_SERVICE ก่อน นี่คือการอนุญาตตามปกติดังนั้นระบบจะมอบให้แอปที่ร้องขอโดยอัตโนมัติ การเริ่มบริการเบื้องหน้าโดยไม่ได้รับอนุญาตจะทำให้เกิด SecurityException

วิธีแก้ไขคือเพียงเพิ่มสิ่งต่อไปนี้ในAndroidManifest.xml:

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

8
หมายความว่าหากเราtargetSdkVersionต่ำกว่า 28 เราไม่ต้องการสิทธิ์ใด ๆ ในการใช้บริการ Foreground ในอุปกรณ์ที่ใช้ 28

3
นั่นฟังดูแปลก ๆ สำหรับฉันเพื่อลด targetSdkVersion
Denny

2
@Sjd พวกเขาจะติดตั้งได้ดี maxSdkVersionมันไม่ได้เป็นเช่นนั้น
Roy Solberg

9
โหวตคำตอบของคุณ แต่บันทึกประจำรุ่นไม่ใช่ข้อแก้ตัวสำหรับการสร้าง API ที่ใช้งานร่วมกันได้แบบไม่ย้อนหลัง ในกรณีนี้ Google อาจขอให้ผู้ใช้อนุญาตหรืออย่างน้อยก็ให้คำแนะนำแทนแอปที่หยุดทำงานอย่างเงียบ ๆ Android กลายเป็นเรื่องยากมากที่จะรักษาเมื่อเร็ว ๆ นี้
Oleg Gryb

2
@miladsalimi หากคุณเปิด AndroidManifest.xml ใน Android Studio คุณสามารถเลือกที่จะเห็น "รายการที่ผสาน" อาจมีการพึ่งพาซึ่งใช้การอนุญาตการใช้งานสำหรับคุณหรือไม่
Roy Solberg

43

การปฏิเสธสิทธิ์: startForeground ต้องใช้ android.permission.FOREGROUND_SERVICE

ปพลิเคชันที่เป้าหมายของ Android 9 (API ระดับ 28) FOREGROUND_SERVICE permissionหรือสูงกว่าและการใช้บริการเบื้องหน้าต้องขอ

ดังนั้นตอนนี้เราจำเป็นต้องเพิ่มการอนุญาตให้บริการ Foregroundในไฟล์ Manifest

  • อนุญาตให้แอปพลิเคชันทั่วไปใช้ Service.startForeground

ตัวอย่าง

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

FOREGROUND_SERVICE เป็นการอนุญาตตามปกติดังนั้นระบบจะมอบให้แอปที่ร้องขอโดยอัตโนมัติ

ตรวจสอบบันทึกการโยกย้ายของ Android 9 / Pie

  • เปลี่ยนแปลง

การอนุญาตให้บริการเบื้องหน้า

  • สรุป

แอปที่ต้องการใช้บริการเบื้องหน้าต้องขอสิทธิ์จาก FOREGROUND_SERVICE ก่อน นี่คือการอนุญาตตามปกติดังนั้นระบบจะมอบให้แอปที่ร้องขอโดยอัตโนมัติ การเริ่มบริการเบื้องหน้าโดยไม่ได้รับอนุญาตจะทำให้เกิด SecurityException

ยังอ่าน startForeground()

  • แอปที่กำหนดเป้าหมาย API Build.VERSION_CODES.Pหรือใหม่กว่าต้องขออนุญาตManifest.permission.FOREGROUND_SERVICEเพื่อใช้ API นี้

คุณชายฉันพยายามแก้ปัญหาของคุณ แต่มันไม่ทำงานสำหรับฉันสำหรับทุกอุปกรณ์ android.like ใน Oppo F11 Pro มันทำงานได้ แต่ใน Samsung, Nokia และ Mi แอพโทรศัพท์ล้มเหลวและมีข้อผิดพลาดเดียวกันใน log.can u บอกฉันว่าฉันทำอะไร แก้ไขปัญหา?
Kapil soni

@Kapilsoni `มีข้อผิดพลาดเดียวกันใน log` ข้อผิดพลาดที่คุณจะได้รับคืออะไร
Nilesh Rathod

ผมได้รับข้อผิดพลาดนี้ "android.app.RemoteServiceException: การแจ้งเตือนไม่ดีสำหรับ startForeground:"
พิล soni

8

สำหรับ API ระดับ 28 ขึ้นไปต้องได้รับอนุญาตจาก FOREGROUND_SERVICE มิฉะนั้นจะไม่สามารถเรียกใช้และได้รับการยกเว้น

มันจะแก้ไขได้โดยการเพิ่ม

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

ในไฟล์ AndroidManifest.xml


ฉันได้เพิ่ม แต่ไม่คงที่สำหรับฉัน
Kapil soni

@Kapilsoni ปัญหาเดียวกันสำหรับฉันเพิ่ม แต่ยังล้มเหลวเนื่องจากการอนุญาตไม่เพียงพอใน API 29 คุณจัดการเพื่อแก้ไขได้หรือไม่
ArturM

4

targetSdkVersionอย่างน้อย28จะมีผลบังคับใช้ตั้งแต่ 1 พฤศจิกายน 2019 สำหรับการปรับปรุงแอปใน Play สโตร์ ดังนั้นคุณจะต้องเปลี่ยน API เป้าหมายแล้วขออนุญาตFOREGROUND_SERVICEเพื่อหลีกเลี่ยงความผิดพลาดstartForeground()


0

การแจ้งเตือนนั้นFOREGROUND_SERVICEไม่จำเป็นต้องมีข้อกำหนดสิทธิ์การใช้งานจริง เพิ่มด้านล่างลงในรายการเท่านั้น

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

ควรเพิ่มบรรทัดข้างต้นก่อน <application

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.