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?
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"
}
}
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é.
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.
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.