Après la mise à niveau de mon téléphone vers la version 8.1 Developer Preview, mon service d'arrière-plan ne démarre plus correctement.
Dans mon service de longue date, j'ai implémenté une méthode startForeground pour démarrer la notification en cours qui est appelée lors de la création.
@TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
// Safe call, handled by compat lib.
val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
startForeground(101, notification)
}
Message d'erreur:
11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
Process: $PACKAGE_NAME, PID: 24704
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
canal invalide pour la notification de service , apparemment mon ancien canal le DEFAULT_CHANNEL_ID n'est plus approprié pour l'API 27 je suppose. Quel serait le canal approprié? J'ai essayé de parcourir la documentation
Réponses:
Après avoir bricolé pendant un certain temps avec différentes solutions, j'ai découvert qu'il fallait créer un canal de notification sous Android 8.1 et supérieur.
D'après ce que j'ai compris, les services d'arrière-plan sont maintenant affichés comme des notifications normales que l'utilisateur peut alors choisir de ne pas afficher en désélectionnant le canal de notification.
Mise à jour : n'oubliez pas non plus d'ajouter l'autorisation de premier plan comme requis Android P:
la source
IMPORTANCE_DEFAULT
au lieu deIMPORTANCE_NONE
?Solution Java (Android 9.0, API 28)
Dans votre
Service
classe, ajoutez ceci:MISE À JOUR: ANDROID 9.0 PIE (API 28)
Ajoutez cette autorisation à votre
AndroidManifest.xml
fichier:la source
La première réponse n'est géniale que pour les personnes qui connaissent kotlin, pour ceux qui utilisent encore java ici, je traduis la première réponse
Pour Android, n'oubliez pas d'inclure cette autorisation
la source
Fonctionne correctement sur Andorid 8.1:
Exemple mis à jour (sans code obsolète):
Ancien extrait (c'est une application différente - non liée au code ci-dessus):
la source
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
àNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
quoi de mieux à utiliser?Dans mon cas, c'est parce que nous avons essayé de publier une notification sans spécifier le
NotificationChannel
:Le meilleur endroit pour mettre le code ci-dessus est dans
onCreate()
method dans laApplication
classe, de sorte que nous ayons juste besoin de le déclarer une fois pour toutes:Après avoir configuré cela, nous pouvons utiliser la notification avec le que
channelId
nous venons de spécifier:Ensuite, nous pouvons l'utiliser pour publier une notification:
Si vous souhaitez l'utiliser comme notification du service de premier plan:
la source
Grâce à @CopsOnRoad, sa solution a été d'une grande aide mais ne fonctionne que pour le SDK 26 et supérieur. Mon application cible 24 et plus.
Pour empêcher Android Studio de se plaindre, vous avez besoin d'un conditionnel directement autour de la notification. Il n'est pas assez intelligent de savoir que le code est dans une méthode conditionnelle à VERSION_CODE.O.
la source
Cela a fonctionné pour moi. Dans ma classe de service, j'ai créé le canal de notification pour Android 8.1 comme ci-dessous:
Remarque: créez le canal sur lequel vous créez la notification pour
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
la source
Voici ma solution
J'espère que cela aidera :)
la source