Aller au contenu
Narvy

Type et permission de service de premier plan manquants sur Android 14

À partir d'un targetSdkVersion de 34, chaque service lancé au premier plan doit déclarer android:foregroundServiceType, et l'application doit demander la permission FOREGROUND_SERVICE_<TYPE> correspondante. Sinon startForeground() lève une exception et l'application plante. Déclarez le type, ajoutez la permission, passez le type à startForeground.

Logcat, à l'exécution
android.app.MissingForegroundServiceTypeException: Starting FGS without a type callerApp=ProcessRecord{...} targetSDK=34
Logcat, à l'exécution
java.lang.SecurityException: Starting FGS with type camera callerApp=ProcessRecord{...} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_CAMERA]

Ce que cela signifie

Android 14 a rendu obligatoire le type de chaque service de premier plan, pour que le système et Google Play sachent pourquoi le service tourne (lecture multimédia, localisation, synchronisation de données, etc.). Chaque type a sa propre permission en plus de android.permission.FOREGROUND_SERVICE ; certains types exigent aussi une permission d'exécution, comme la caméra ou la localisation.

Le contrôle signale deux cas : l'application demande FOREGROUND_SERVICE mais aucun service ne déclare de type, et un service déclare un type sans sa permission FOREGROUND_SERVICE_*. Les deux sont signalés en info : ils ne plantent à l'exécution que si le service est réellement lancé, et les services déclarés par des bibliothèques listent souvent des types que l'application n'utilise jamais.

Échéance

Pas de date propre au store : la règle s'applique dès que targetSdkVersion vaut 34 ou plus, ce que rend obligatoire l'exigence de niveau d'API cible de Google Play.

Corriger

1. Déclarer le type et sa permission

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

<service
    android:name=".PlayerService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="false" />

2. Passer le type au lancement

PlayerService.kt
ServiceCompat.startForeground(
    this, NOTIFICATION_ID, notification,
    ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
)

3. Retirer ce qui ne sert pas

Si l'application demande FOREGROUND_SERVICE sans lancer de service de premier plan, retirez la permission. Si une bibliothèque déclare un type que vous ne lancez jamais, la permission manquante est sans effet à l'exécution, mais le type exige quand même une déclaration dans la Play Console (voir la page liée).

Vérifier avant de soumettre

Déposez l'APK, AAB ou lot d'APK fractionnés (XAPK, APKS, APKM) sur la page de contrôle des stores. Elle exécute PLAY-FGS-TYPE PLAY-FGS-PERMISSION avec les dates de cette page, puis supprime le fichier : rien de l'application n'est conservé. Le même moteur tourne hors ligne dans la CLI Narvy et renvoie le code 1 quand un point bloquant est trouvé, ce qui permet de bloquer un job de CI.

Hors ligne, depuis un terminal (narvy-cli 1.2.0 ou plus)
narvy store-check app-release.aab --lang fr

Contrôler un build dans le navigateur

Questions fréquentes

Quel type choisir ?

Celui qui correspond à ce que voit l'utilisateur : mediaPlayback, location, dataSync, connectedDevice, camera, microphone, phoneCall, health, remoteMessaging, mediaProjection, mediaProcessing, shortService, specialUse ou systemExempted. La page des types de services d'Android détaille les conditions de chacun.

shortService a-t-il besoin d'une permission dédiée ?

Non. shortService n'a besoin que de FOREGROUND_SERVICE ; le contrôle n'attend pas de permission spécifique pour ce type.