Question Erreur de rappel d'intention de diffusion: resultat = ANNULÉ pourIntent {act = com.google.android.c2dm.intent.RECEIVE pkg = com.flagg327.guicomaipu (contient des extras)}


Je reçois cette erreur du moniteur Android d'Android Studio. Cette erreur apparaît lorsque j'envoie une notification push via GCM, dans un appareil réel, et que l'application n'a pas encore été démarrée ou a été forcée de s'arrêter. Hier, tout fonctionne bien, aujourd'hui ne fonctionne pas du tout (ne fonctionne que si l'application s'exécute en arrière-plan ou au premier plan).

Je pense que cela peut être un AndroidManifest erreur, mais je suis fatigué de chercher le problème et ne peut rien trouver.

Manifeste

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.flagg327.guicomaipu">

    ...

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        ...

        <!--GOOGLE CLOUD MESSAGE-->
        <receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <!-- for Gingerbread GSF backward compat -->
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.flagg327.guicomaipu" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.flagg327.guicomaipu.gcm.RegistrationService"
            android:exported="false" />

        <service
            android:name="com.flagg327.guicomaipu.gcm.TokenRefreshListenerService"
        android:exported="false">
            <intent-filter>
                <action
                    android:name="com.google.android.gms.iid.InstanceID" />
            </intent-filter>
        </service>

        <service
            android:name="com.flagg327.guicomaipu.gcm.NotificacionsListenerService"
        android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>

    </aplication>

    <permission 
        android:name="com.flagg327.guicomaipu.C2D_MESSAGE"
            android:protectionLevel="signature" />
    <uses-permission android:name="com.flagg327.guicomaipu.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

TokenRefreshListenerService.java

L'inscription «jetons» est mise à jour chaque jour. C'est parce que chaque application Android qui utilise GCM doit avoir un InstanceIDListenerService qui gère ces mises à jour.

public class TokenRefreshListenerService extends InstanceIDListenerService{

    @Override
    public void onTokenRefresh() {
        // Launch the registration process.
        Intent i = new Intent(this, RegistrationService.class);
        startService(i);
    }
}

NotificacionsListenerService.java

GCM affiche automatiquement les notifications push, mais uniquement si l'application associée possède un service GCMListenerService

public class NotificacionsListenerService extends GcmListenerService {

    @Override
    public void onMessageReceived(String from, Bundle data) {
        Log.d("A", "onMessageReceived()");

        // Do something

    }
}

RegistrationService.java

GCM identifie les périphériques Android à l'aide de cartes d'enregistrement («jetons»). Mon application doit pouvoir être enregistrée à partir de chaque périphérique Android sur lequel elle est installée.

public class RegistrationService extends IntentService {

    /**
     * Constructor
     */
    public RegistrationService() {
        super("RegistrationService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // Generate or download the registration 'token'.
        InstanceID myID = InstanceID.getInstance(this);

        String registrationToken = null;
        try {
            // Get the registration 'token'.
            registrationToken = myID.getToken(
                    getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE,
                    null
            );

            // Subscribe to a topic. The app is able now to receive notifications from this topic.
            GcmPubSub subscription = GcmPubSub.getInstance(this);
            subscription.subscribe(registrationToken, "/topics/guico_maipu_topic", null);
        } catch (IOException e) {
            e.printStackTrace();
        }

        Log.e("Registration Token", registrationToken);
    }
}

Erreur

Cette erreur apparaît lorsque j'envoie une notification push via python.

09-13 21:21:44.800 1851-1851/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.flagg327.guicomaipu (has extras) }

Hier travaillait ... Une idée? Que vous pour votre temps.


17
2017-09-14 00:43


origine


Réponses:


J'ai eu la même erreur

09-13 21:21:44.800 1851-1851/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.XXX.XXX (has extras) }

après avoir tué l'application.

Après quelques recherches, j'ai réalisé que ce n'est qu'un "problème de débogage". Un "APK signé" gère la diffusion correctement même si l'application a été fermée.

J'espère que cela aide!


8
2018-02-15 13:28



Alors ... j'ai résolu le problème. Le problème était que le périphérique n'est pas enregistré pour recevoir GCM si l'application est forcée fermée ou si l'application n'a jamais été ouverte depuis le démarrage du périphérique. La solution est simple, enregistrez l'appareil sur le téléphone. Pour cela, j'ai mis en place un BroadcastReceiver et commencé un enregistrement de processus à l'intérieur.

Les modifications:

Ajouté à AndroidManifest

    <receiver android:name="com.flagg327.guicomaipu.gcm.OnBootBroadcastReceiver">
        <intent-filter >
            <action android:name="android.intent.action.BOOT_COMPLETED" />

            <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </receiver>

OnBootBroadcastReceiver.java

public class OnBootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Intent i = new Intent("com.flagg327.guicomaipu.gcm.RegistrationService");
        i.setClass(context, RegistrationService.class);
        context.startService(i);
    }
}

Ainsi, au démarrage, le périphérique s'enregistrera sur le serveur GCM et pourra recevoir toute notification push de mon serveur. J'espère que cela est utile.


7
2017-09-14 14:08



Après avoir compris pourquoi cela se produit, il semble que cela se produise si vous tuez l'application depuis Android Studio.

Si vous ouvrez l'application depuis le lanceur et que vous la balayez, votre application recevra toujours des notifications.

(Testé sur OnePlus One avec FCM pas GCM)


4
2017-08-15 06:30



J'étais également confronté au problème. Lorsque je supprime l'application de la pile, ne pas recevoir de notification. Après beaucoup de Google, j'ai constaté que peu de téléphones ont une fonction d'optimisation de la batterie et que cela désactivera le fonctionnement en arrière-plan des applications. Lorsque j'active que mon application peut également fonctionner en arrière-plan. Notification push fonctionne correctement. Seules quelques applications, telles que What 's application, etc. ne peuvent avoir que des fonctionnalités d’activation par défaut. Vous pouvez consulter cette URL ci-dessous.

https://github.com/firebase/quickstart-android/issues/89


0
2018-02-02 13:08