📱 Android

[Android] ForegroundService - SecurityException

콩드로이드 2025. 10. 24. 20:28

 

Caused by: java.lang.SecurityException: Starting FGS with type microphone

service 실행 중 SecurityException이 발생했었는데, 원인을 살펴보면 Android 14부터 강화된 Foreground Service(이하 FGS) 정책과 관련된 경우였습니다 

 

우선 Android 14와 무관하게, 서비스 실행 시점이 foreground 상태가 아닐 경우 FGS 관련 SecurityException이 발생합니다.

(이 포스팅에서는 이 부분은 제외하고, Android 14 변경사항 위주로 정리해볼게요..!)

 


 

Android 14부터는 아래의 특정 FGS 유형(Foreground Service Type) 에 대해 추가적인 조건이 요구됩니다 

camera, connectedDevice, dataSync, health, location, mediaPlayback, mediaProjection

microphone, phoneCall, remoteMessaging, shortService, specialUse, systemExempted

 

 

1. android:foregroundServiceType 지정 (AndroidManifest.xml)


Android10에서는 service를 사용할 때 manifest에서 android:foregroundServiceType을 지정할 수 있었다면,

Android14에서는 특정 권한들은 아래와 같이 android:foregroundServiceType 지정이 필수가 되었습니다 

  <service android:name="서비스 클래스명"
           android:foregroundServiceType="dataSync"/>

 

Manifest에서 특정 서비스의 유형을 정의하지 않으면 시스템은 해당 서비스의 startForeground() 호출 시  MissingForegroundServiceTypeException을 발생할 수 있습니다,, 

 

 

2. startForeground()호출 시 타입 명시

startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA)

Manifest에 정의된 타입과 startForeground() 호출 시 지정한 타입이 일치해야  시스템이 서비스 목적을 명확히 인식하고 권한 검사를 올바르게 수행합니다

 

 

3.  Runtime 권한(Prerequisites) 확인

Android 14에서는 포그라운드 서비스 유형(Foreground Service Type)에 따라 런타임에서 반드시 충족해야 하는 권한 조건이 추가되었습니다.

예를 들어,

  • FOREGROUND_SERVICE_TYPE_LOCATION → ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION
  • FOREGROUND_SERVICE_TYPE_CAMERA → CAMERA
  • FOREGROUND_SERVICE_TYPE_MICROPHONE → RECORD_AUDIO

 

startForeground() 호출 시, 해당 서비스 유형에 맞는 런타임 권한이 이미 허용되어 있는지를 검사합니다.

즉, 앱이 아직 권한을 요청하거나 승인받기 전 상태에서 startForeground()를 호출하면 SecurityException이 발생합니다.

 

 


정리하자면 Android 14에서는 포그라운드 서비스의 유형 선언, 권한 요청 시점이 모두 명확해야 합니다
Manifest, startForeground(), 권한 요청 시점 — 이 세 개가 맞물리지 않으면  SecurityException이 발생할 수 있어요 

 

공식 문서를 살펴보면 아래와 같이 각각 어떤 값을 설정해줘야하는지 나와있습니다 

 

특정 FGS 유형를 사용하시는 경우엔 공식문서에서 요건들을 확인하면 될 거 같습니다