권한 거부 : 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 권한을.

에서 마이그레이션 노트 안드로이드 9 :

포 그라운드 서비스를 사용하려는 앱은 이제 먼저 FOREGROUND_SERVICE 권한을 요청해야합니다. 이것은 일반적인 권한이므로 시스템이 요청하는 앱에 자동으로 권한을 부여합니다. 권한없이 포 그라운드 서비스를 시작하면 SecurityException이 발생합니다.

해결책은 다음을 추가하는 것입니다 AndroidManifest.xml.

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

8
즉 우리의 경우 평균 않는다 targetSdkVersion, 우리는 28를 실행하는 장치에서 전경 서비스를 실행할 수있는 권한이 필요하지 않습니다 (28)보다 낮다?

3
나에게 이상한 솔루션과 같은 소리는 targetSdkVersion을 낮출 것을
데니

2
@Sjd 그들은 잘 설치됩니다. 그렇지 않은 것 같습니다 maxSdkVersion.
Roy Solberg

9
답변을 찬성 투표하지만 릴리스 노트는 이전 버전과 호환되지 않는 API를 작성하는 데 변명하지 않습니다. 이 경우 Google은 사용자에게 앱을 자동으로 중단하는 대신 권한을 부여하거나 힌트를 제공하도록 요청할 수 있습니다. 안드로이드는 최근에 유지하기가 매우 어려워집니다.
올렉 그리브

2
@miladsalimi Android Studio에서 AndroidManifest.xml을 열면 "병합 된 매니페스트"를 볼 수 있습니다. 어쩌면 권한 사용을 주입하는 종속성이 있습니까?
Roy Solberg 2016 년

43

권한 거부 : startForeground에는 android.permission.FOREGROUND_SERVICE가 필요합니다.

Android 9 (API 레벨 28) 이상을 대상으로하고 포 그라운드 서비스를 사용하는 앱은을 요청해야합니다 FOREGROUND_SERVICE permission.

이제 매니페스트 파일에 Foreground 서비스 권한 을 추가해야 합니다.

  • 일반 응용 프로그램을 사용할 수 있습니다 Service.startForeground

견본

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

FOREGROUND_SERVICE 일반 권한이므로 시스템에서 요청하는 앱에 자동으로 권한을 부여합니다.

Android 9 / Pie의 마이그레이션 노트를 확인하십시오.

  • 변화

포 그라운드 서비스 권한

  • 요약

포 그라운드 서비스를 사용하려는 앱은 이제 먼저 FOREGROUND_SERVICE 권한을 요청해야합니다. 이것은 일반적인 권한이므로 시스템이 요청하는 앱에 자동으로 권한을 부여합니다. 권한없이 포 그라운드 서비스를 시작하면 SecurityException이 발생합니다.

또한 읽기 startForeground()

  • 이 API를 사용 Build.VERSION_CODES.P하려면 API 이상을 대상으로하는 앱 이 권한 Manifest.permission.FOREGROUND_SERVICE을 요청해야합니다 .

선생님은 UR 솔루션을 시도했지만 Oppo F11 Pro와 같은 모든 안드로이드 장치에서 작동하지 않지만 Samsung, Nokia 및 Mi 전화 앱에서 작동이 중단되고 로그에 동일한 오류가 발생합니다. 고치다?
Kapil soni

@Kapilsoni`로그에 같은 오류가 발생했습니다. 어떤 오류가 발생합니까?
Nilesh Rathod

이 오류가 발생했습니다 "android.app.RemoteServiceException : startForeground에 대한 잘못된 알림 :"
Kapil soni

8

API 레벨 28 이상의 경우 FOREGROUND_SERVICE 권한이 필요합니다. 그렇지 않으면 실행할 수 없으며 예외가 발생합니다.

추가하면 해결됩니다

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

AndroidManifest.xml 파일에서.


나는 추가했지만 나를 위해 수정되지 않았습니다
Kapil soni

@Kapilsoni 저에게 동일한 문제가 추가되었지만 API 29에 대한 권한이 충분하지 않아 여전히 충돌합니다. 문제를 해결 했습니까?
ArturM

4

targetSdkVersion최소한의는 28Play 스토어에서 앱 업데이트 2019년 11월 1일에서 필수가 될 것입니다. 따라서 대상 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.