2017-10-13 2 views
0

Nous avons migré notre application maintenant de Android 25 àAndroid Oreo - push accident de notification

compileSdkVersion 26 
buildToolsVersion "26.0.0" 

J'ai modifié toutes les versions des dépendances ainsi. Nous utilisons toujours GCM.jar dans notre application.

Lorsque nous recevons une notification push sur Oreo Device, les plantages d'application.

journaux Crash:

Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x1000010 app is in background uid UidRecord{13c38ce u0a297 RCVR bg:+3m5s626ms idle procs:1 seq(0,0,0)} 
+1

le pot de GCM est très, très vieux et obsolète. vous devriez utiliser FCM dans Firebase maintenant. Le pot n'a pas les changements nécessaires pour les nouvelles limitations d'arrière-plan d'Oro O – tyczj

+0

@ramya avez-vous résolu ce problème? Je suis face à celui-ci –

+0

@ Passionate.C: Avez-vous corrigé le problème? – Debugger

Répondre

2

S'il vous plaît utiliser Goolgle-Cloud Messaging dépendance gradle aussi bien dans votre gradle. Ou la meilleure solution est de passer à Firebase. Firebase a des tonnes d'outils comme GCM.

Selon le official docs: Firebase Cloud Messaging (FCM) est la nouvelle version de GCM. Il hérite de l'infrastructure GCM fiable et évolutive, ainsi que de nouvelles fonctionnalités! Si vous intégrez la messagerie dans une nouvelle application, commencez par FCM. Il est fortement recommandé aux utilisateurs de GCM de passer à FCM, afin de bénéficier des nouvelles fonctionnalités FCM aujourd'hui et dans le futur.

Pour la migration vers Firebase, reportez-vous here

0

Même si son recommandé de passer à Firebase, voici la solution pour ceux qui ne peuvent pas mettre à jour.

  1. Set outils de construction pour 26.0.1+
  2. Assurez-vous pas plus étendue Wakeful de diffusion mais tout à fait normal diffusion
  3. Créer une classe qui étend JobServiceIntent et planifier une tâche à elle.

Avec Job Service il est possible de travailler en arrière-plan à Oreo.

Voici l'échantillon de la classe JobServiceIntent

package com.voxelbusters.nativeplugins.features.notification.core; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.JobIntentService; 

import com.google.android.gms.gcm.GoogleCloudMessaging; 
import com.voxelbusters.nativeplugins.defines.CommonDefines; 
import com.voxelbusters.nativeplugins.utilities.Debug; 
import com.voxelbusters.nativeplugins.utilities.JSONUtility; 

import org.json.JSONObject; 

/** 
* Created by ayyappa on 09/02/18. 
*/ 

public class NotificationJobService extends JobIntentService 
{ 
    /** 
    * Unique job ID for this service. 
    */ 
    static final int JOB_ID = 1000; 

    /** 
    * Convenience method for enqueuing work in to this service. 
    */ 
    public static void enqueueWork(Context context, Intent work) { 
     enqueueWork(context, NotificationJobService.class, JOB_ID, work); 
    } 

    @Override 
    protected void onHandleWork(Intent intent) 
    { 

     Bundle extras = intent.getExtras(); 
     GoogleCloudMessaging service = GoogleCloudMessaging.getInstance(this); 

     String messageType = service.getMessageType(intent); 

     Debug.log(CommonDefines.NOTIFICATION_TAG, "GCMIntentService received message type : " + messageType); 

     if (!extras.isEmpty()) 
     { 
      if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) 
      { 
       // Post notification of the received message (extras). 

      } 
     } 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
    } 

} 

Appelez dès maintenant enqueWork sur réception d'une émission comme ci-dessous.

package com.voxelbusters.nativeplugins.features.notification.serviceprovider.gcm; 

import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 

import com.voxelbusters.nativeplugins.features.notification.core.NotificationDefines; 
import com.voxelbusters.nativeplugins.features.notification.core.NotificationJobService; 

public class GCMBroadcastReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (!NotificationDefines.usesExtenralRemoteNotificationService(context)) 
     { 
      // Explicitly specify that GCMIntentService will handle the intent. 
      ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName()); 
      intent.setComponent(comp); 
      NotificationJobService.enqueueWork(context, intent); 
     } 
    } 
} 

Espérons que ça aide!