web-dev-qa-db-fra.com

Problème lors de la réception d'une notification Push sur le client GCM

J'essaie d'implémenter la notification Push à l'aide de GCM dans mon application Android. J'ai créé un serveur pour envoyer des messages aux périphériques avec succès et j'ai également créé une API permettant de stocker le jeton de périphérique sur le serveur. Création d'un client dans l'application mentionnée dans le link basé sur le exemple de projet . Et également créé une fonction dans php pour envoyer une notification à l'application. Lorsque j'exécute cette fonction sur le serveur, la réponse est un succès. Cela signifie que le message est envoyé de gcm à mobile. Mais la notification ne s'affiche pas à la place, je reçois le message suivant dans le journal du chat.

06-05 14:58:59.172  23693-28001/com.greenboards.base I/dalvikvm﹕ Could not find method Android.app.Notification$Builder.setColor, referenced from method com.google.Android.gms.gcm.zza.zzv
06-05 14:58:59.172  23693-28001/com.greenboards.base W/dalvikvm﹕ VFY: unable to resolve virtual method 184: Landroid/app/Notification$Builder;.setColor (I)Landroid/app/Notification$Builder;
06-05 14:58:59.173  23693-28001/com.greenboards.base D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0068
06-05 14:58:59.175  23693-28001/com.greenboards.base W/GcmNotification﹕ Failed to show notification: Missing icon

Pour capturer le message, j'utilise le même service d'écouteur que celui indiqué dans l'exemple d'application (j'ai ajouté ci-dessous pour la référence). J'ai donc pensé au problème dans le gestionnaire de notifications. J'ai donc commenté et exécuté l'application. Mais encore une fois, je reçois la même réponse sans aucune notification. Je ne sais pas quel est le problème.

package com.greenboards.base;

import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.content.Context;
import Android.content.Intent;
import Android.media.RingtoneManager;
import Android.net.Uri;
import Android.os.Bundle;
import Android.support.v4.app.NotificationCompat;
import Android.util.Log;
import com.greenboards.base.R;

import com.google.Android.gms.gcm.GcmListenerService;
import com.greenboards.base.SplashScreen;

public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";

    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "Message: " + message);

        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
        sendNotification(message);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received GCM message.
     *
     * @param message GCM message received.
     */
    private void sendNotification(String message) {
        /*Intent intent = new Intent(this, SplashScreen.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 *//* Request code *//*, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setContentTitle("GCM Message")
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 *//* ID of notification *//*, notificationBuilder.build());*/
        Log.v("notification message",message);
    }
}

Mais chaque fois que le message est reçu du serveur, la variable onMessageReceived doit être appelée dans le programme d'écoute ci-dessus. Dans la fonction onMessageReceived, il existe deux fonctions de journalisation pour afficher le message et l'expéditeur. Ce n'est pas non plus en cours d'exécution. Cela signifie que la fonction elle-même ne s'exécute pas. Ci-dessous, j'ai ajouté le contenu du manifeste.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.greenboards.base"
    Android:versionCode="1"
    Android:versionName="1.0">

    <uses-sdk
        Android:minSdkVersion="9"
        Android:targetSdkVersion="19" />

    <!-- Application Permissions -->
    <uses-permission Android:name="Android.permission.INTERNET" />
    <uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
    <uses-permission Android:name="Android.permission.WAKE_LOCK" />
    <uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />

    <permission
        Android:name="com.greenboards.base.permission.C2D_MESSAGE"
        Android:protectionLevel="signature" />

    <uses-permission Android:name="com.greenboards.base.permission.C2D_MESSAGE" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.VIBRATE" />

    <!-- Application Configuration and Activities -->
    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme">
        <activity Android:name=".SplashScreen">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- [START gcm_receiver] -->
        <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="com.google.Android.c2dm.intent.RECEIVE" />
                <category Android:name="com.greenboards.base" />
            </intent-filter>
        </receiver>
        <!-- [END gcm_receiver] -->

        <!-- [START gcm_listener] -->
        <service
            Android:name="com.greenboards.base.MyGcmListenerService"
            Android:exported="false" >
            <intent-filter>
                <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <!-- [END gcm_listener] -->
        <!-- [START instanceId_listener] -->
        <service
            Android:name="com.greenboards.base.MyInstanceIDListenerService"
            Android:exported="false">
            <intent-filter>
                <action Android:name="com.google.Android.gms.iid.InstanceID"/>
            </intent-filter>
        </service>
        <!-- [END instanceId_listener] -->
        <service
            Android:name="com.greenboards.base.RegistrationIntentService"
            Android:exported="false">
        </service>

    </application>
</manifest>

Encore maintenant je ne peux pas pouvoir déboguer quel est le problème. Est-ce que je fais quelque chose de mal ou est-ce que je manque quelque chose?

12

Selon ceci link vous devriez avoir une paire icône/valeur.

Vérifiez le paramètre icône de la charge de notification. Il est spécifié comme requis.

Donc, vous devez inclure une icône dans le JSON.

Un exemple pourrait être

{
    "to":   
"ci4ZzC4BW....",  
    "notification": {  
        "title": "Testing",  
        "body": "Success",  
        "icon": "@drawable/myicon"  
    }  
}

myicon est l'image nommée myicon.png dans le dossier drawable de l'application.

onMessageReceived est appelé lorsqu'un message avec data payload est reçu. Lorsque nous remplaçons notification par data (comme ci-dessous), la fonction onMessageReceived sera alors appelée.

{
    "to":   
"ci4ZzC4BW....",  
    "data": {  
        "title": "Testing",  
        "body": "Success",  
        "icon": "@drawable/myicon"  
    }  
}
12
rohitsakala

Je rencontre le même problème

regardez les informations dans logcat:

dalvikvm﹕ Could not find method Android.app.Notification$Builder.setColor, referenced from method com.google.Android.gms.gcm.zza.zzv

dalvikvm﹕ VFY: unable to resolve virtual method 173: Landroid/app/Notification$Builder;.setColor (I)Landroid/app/Notification$Builder;

et référencez le document API: http://developer.Android.com/reference/Android/app/Notification.Builder.html

rechercher "setColor" vous le découvrirez ajouté dans "API niveau 21", signifie que cette méthode ne fonctionne que ci-dessus 5.0 (Lollipop)

J'ai essayé la structure ci-dessous test sur 2 périphériques OS différents, 5.0 et 4.4 respectivement, et ne fonctionne que sur la version 5.0

{"to": "/topics/global","data": {"message": "<message>"},"notification": {"icon": "ic_stat_ic_notification","body": "Use Gradle Command","title": "Self test"}}

Remarque: J'utilise le test JSON sous OS 5.0. La notification est affichée, mais onMessageReceived n'est toujours pas appelé.

0
Ivan

Bien que ce fût un vieux fil, je voulais ajouter quelque chose à propos de problèmes similaires que j'avais rencontrés.

L'application a deux états: actif et inactif .

Si l'application est active, l'envoi d'une notification sans icône valeur (je suppose que la clé est toujours requise) fonctionnerait toujours. Ça marche pour moi mais la clé est toujours là.

Mon objet JSON ressemble à ceci:

.., icon=, sound=default, title=Bruce...

De la documentation développeur:

Pour une application Android active, les charges utiles de notification sont transmises à onMessageReceived () sous la clé de notification du paquet de données.

Lorsque l'application est inactive:

Les notifications sont livrées à la barre de notification lorsque l'application est inactive.

Et voici quand je frappe le problème Missing icon. Donc, une paire clé/valeur est requise si l'application est inactive.

Si le contenu est une notification, assurez-vous qu'il a toujours la paire clé/valeur icon afin qu'il fonctionne comme prévu, que l'application soit active ou inactive.

Voir ici pour plus de détails

Enfin, il devrait y avoir une distinction claire entre ce qu'est une notification et ce que est un data, dans la conception de l'application. J'avais utilisé notification pour tous les messages Push de mon application, ce qui, à mon avis, n'est pas la bonne façon de le faire.

0
srinij