Từ chối cấp phép: startForeground yêu cầu ERIC.FOREGROUND_SERVICE


193

Gần đây, chúng tôi đột nhiên nhìn thấy một vài dấu vết ngăn xếp sau đây. Tại sao có thể như vậy? Đây là từ khi ứng dụng cố gắng di chuyển một dịch vụ bình luận âm thanh vào nền trước với thông báo phương tiện và mọi thứ.

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)

Câu trả lời:


411

Điều này sẽ xảy ra nếu bạn đã đặt targetSdkVersion = 28(Android 9 / Pie) trở lên và chưa tuyên bố việc sử dụng FOREGROUND_SERVICEquyền.

Từ ghi chú di chuyển cho Android 9:

Các ứng dụng muốn sử dụng dịch vụ nền trước hiện phải yêu cầu quyền FOREGROUND_SERVICE trước tiên. Đây là một quyền bình thường, vì vậy hệ thống sẽ tự động cấp nó cho ứng dụng yêu cầu. Bắt đầu một dịch vụ nền trước mà không có sự cho phép sẽ ném SecurityException.

Giải pháp là chỉ cần thêm các mục sau vào AndroidManifest.xml:

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

8
Điều đó có nghĩa là nếu chúng tôi targetSdkVersionthấp hơn 28, chúng tôi không cần bất kỳ sự cho phép nào để chạy các dịch vụ Tiền cảnh trong các thiết bị chạy 28?

3
Nghe có vẻ là một giải pháp kỳ lạ đối với tôi, để hạ thấp mục tiêuSdkVersion
Denny

2
@Sjd Họ sẽ cài đặt tốt. Nó không giống như nó maxSdkVersion.
Roy Solberg

9
Bỏ phiếu cho câu trả lời của bạn, nhưng ghi chú phát hành không phải là lý do để xây dựng API tương thích không lạc hậu. Trong trường hợp này, Google có thể đã yêu cầu người dùng cấp phép hoặc ít nhất cung cấp gợi ý thay vì im lặng làm hỏng ứng dụng. Android trở nên rất khó để duy trì gần đây.
Oleg Gryb

2
@miladsalimi Nếu bạn mở AndroidManifest.xml trong Android Studio, bạn có thể chọn xem "bảng kê khai được hợp nhất". Có lẽ có một sự phụ thuộc mà sử dụng quyền đó cho bạn?
Roy Solberg

43

Từ chối cấp phép: startForeground yêu cầu ERIC.FOREGROUND_SERVICE

Các ứng dụng nhắm mục tiêu Android 9 (API cấp 28) trở lên và sử dụng các dịch vụ nền trước phải yêu cầu FOREGROUND_SERVICE permission.

Vì vậy, bây giờ chúng ta cần thêm quyền dịch vụ Tiền cảnh trong tệp kê khai

  • nó cho phép một ứng dụng thông thường sử dụng Service.startForeground

MẪU VẬT

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

FOREGROUND_SERVICE là một quyền bình thường, vì vậy hệ thống sẽ tự động cấp nó cho ứng dụng yêu cầu.

Kiểm tra ghi chú di chuyển của Android 9 / Pie

  • Thay đổi

Cho phép dịch vụ tiền cảnh

  • Tóm lược

Các ứng dụng muốn sử dụng dịch vụ nền trước hiện phải yêu cầu quyền FOREGROUND_SERVICE trước tiên. Đây là một quyền bình thường, vì vậy hệ thống sẽ tự động cấp nó cho ứng dụng yêu cầu. Bắt đầu một dịch vụ nền trước mà không có sự cho phép sẽ ném SecurityException.

Cũng đọc startForeground()

  • Ứng dụng nhắm mục tiêu API Build.VERSION_CODES.Ptrở lên phải yêu cầu quyền Manifest.permission.FOREGROUND_SERVICEđể sử dụng API này.

thưa ngài, tôi đã thử giải pháp của bạn nhưng nó không hoạt động với tôi cho tất cả các thiết bị Android. Giống như trong Oppo F11 Pro, nó hoạt động nhưng trong ứng dụng điện thoại Samsung, Nokia và Mi đã bị lỗi và gặp lỗi tương tự trong log.can u cho tôi biết tôi làm gì sửa chữa?
Kapil soni

@Kapilsoni `có lỗi tương tự trong log` bạn đang gặp lỗi gì
Nilesh Rathod

tôi đã gặp lỗi này "android.app.RemoteServiceException: Thông báo xấu cho startForeground:"
Kapil soni

8

Đối với API cấp 28 trở lên, nó yêu cầu quyền FOREGROUND_SERVICE. Mặt khác, nó không thể chạy và có một ngoại lệ.

Nó sẽ được giải quyết bằng cách thêm

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

trong tệp AndroidManifest.xml.


tôi đã thêm nhưng không sửa cho tôi
Kapil soni

@Kapilsoni cùng một vấn đề với tôi, đã thêm nhưng vẫn gặp sự cố do không đủ quyền trên API 29, bạn đã quản lý để giải quyết chưa?
ArturM

4

Một targetSdkVersionít nhất 28sẽ được bắt buộc từ ngày 01 tháng 11 năm 2019 cập nhật ứng dụng trong Cửa hàng Play. Vì vậy, bạn sẽ cần thay đổi API mục tiêu và sau đó yêu cầu quyền FOREGROUND_SERVICEđể tránh sự cố trênstartForeground()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.