web-dev-qa-db-fra.com

Android 9 (uniquement): Context.startForegroundService () n'a pas appelé Service.startForeground () - Fonctionne correctement sur Oreo.

Nous avons ajusté notre notification en cours pour Oreo et cela a très bien fonctionné. Maintenant, sur Pie uniquement (ne se produisant pas sur les périphériques Oreo), nous obtenons l'erreur intitulée. Est-ce que quelque chose a changé dans les services de premier plan dans Pie qui me manque?

Voici le code onCreate pour le service de premier plan ->

override fun onCreate() {
    super.onCreate()

    val notification: Notification = NotificationCompat.Builder(this, packageName)
            .setSmallIcon(R.drawable.status_notification_icon)
            .setContentTitle(getString(R.string.ongoing_notify_temp_title))
            .setContentText(getString(R.string.ongoing_notify_temp_message))
            .setGroup(AppConstants.NOTIFICATION_GROUP_ONGOING)
            .setColor(ContextCompat.getColor(this, R.color.custom_blue))
            .build()

    startForeground(ONGOING_NOTIFY_ID, notification)

    appSettings = AppSettings(this)

    weatherLookUpHelper = WeatherLookUpHelper()
    MyRoomDatabase.getInstance().invalidationTracker.addObserver(onChange)

    retrieveCurrentLocation()
    createAlarmManager()
}

comme vous pouvez le constater, nous créons simplement la notification, puis appelons startForeground. Des idées sur pourquoi ce code générerait l'erreur intitulée?

Remarque latérale: Fabric Crashlytics indique que cet incident ne survient que sur des périphériques pixel (pixel, pixel xl, pixel 2, pixel 2 xl) sous Pie

EDIT: Nous avons la permission de premier plan dans notre manifeste

<uses-permission Android:name="Android.permission.FOREGROUND_SERVICE" />
6
Psest328

Est-ce que quelque chose a changé dans les services de premier plan dans Pie qui me manque?

OUI Regardez ici notes de migration d'Android 9/Pie

Changement 

Autorisation de service de premier plan 

Résumé

Les applications souhaitant utiliser les services de premier plan doivent désormais demander d'abord l'autorisation FOREGROUND_SERVICE . Il s’agit d’une autorisation normale. Le système l’accorde donc automatiquement à l’application qui en fait la demande. Le démarrage d'un service de premier plan sans autorisation lève une exception SecurityException.

METTRE &AGRAVE; JOUR

problème associé dans Google Issue Tracker Context.startForegroundService () n’a pas alors appelé Service.startForeground

1
Nilesh Rathod

Comme mentionné ici Limites du service de base , l'application/le service dispose de cinq secondes pour appeler startForeground(). Si l'application n'appelle pas startForeground () dans le délai imparti, le système arrête le service et déclare l'application comme étant ANR.

Il y a quelques possibilités:

  1. Soit votre service de premier plan est détruit/terminé avant d'appeler la méthode startForeground().
  2. Ou si le service de premier plan est déjà instancié et qu'il est appelé à nouveau, la méthode onCreate ne sera pas appelée, mais plutôt onStartCommand. Puis déplacez votre logique vers onStartCommand pour appeler la méthode startForeground().
  3. Votre identifiant de notification dans startForegroundne doit pas être 0 , sinon cela provoquerait également le blocage.
0
Arshad Mehmood