2015-06-05 10 views
12

Ich versuche, Push-Benachrichtigung mit GCM in meiner Android-Anwendung zu implementieren. Ich habe einen Server erstellt, um Nachrichten erfolgreich an Geräte zu senden, und außerdem eine API erstellt, um das Geräte-Token erfolgreich auf dem Server zu speichern. Erstellt einen Client in der Anwendung erwähnt in der link basierend auf der sample project. Und auch eine Funktion in PHP erstellt, um Benachrichtigungen an die App zu senden. Wenn ich diese Funktion auf dem Server ausführe, bekomme ich eine Antwort als Erfolg. Das bedeutet, dass die Nachricht von gcm an mobile gesendet wird. Aber die Benachrichtigung wird nicht angezeigt, stattdessen erhalte ich Folgendes in der Protokollkatze.Problem beim Empfangen von Push-Benachrichtigung auf dem GCM-Client

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 

Um die Nachricht zu erfassen, verwende ich den gleichen Listener-Service, der in der Beispielanwendung (ich unten für die Referenz hinzugefügt) bezeichnet. Also dachte ich über das Problem im Benachrichtigungsmanager nach. Also habe ich es auskommentiert und die Anwendung ausgeführt. Aber wieder bekomme ich die gleiche Antwort ohne jede Benachrichtigung. Ich weiß nicht, was das Problem ist.

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); 
    } 
} 

Aber immer, wenn die Nachricht von dem Server muss die onMessageReceived erhielt in dem obigen Hörer aufgerufen werden. In der onMessageReceived Funktion gibt es zwei Logging-Funktion, um die Nachricht und den Absender anzuzeigen. Das wird auch nicht ausgeführt. Das bedeutet, dass die Funktion selbst nicht ausgeführt wird. Im Folgenden habe ich den Manifest-Inhalt hinzugefügt.

<?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> 

Noch kann ich nicht debuggen, was das Problem ist. Mache ich etwas falsch oder vermisse ich etwas?

+1

Ich bin gerade über das gleiche Problem gestolpert. Allerdings bekomme ich nicht die Warnung '' 'W/GcmNotification: Meldung konnte nicht angezeigt werden: Icon fehlt'''. Kannst du auch zeigen, was du an gcm sendest (deine Curl-Anfrage) – peshkira

+0

Testen Sie auf einem Gerät mit Android API 21? setColor wurde in 21 hinzugefügt und es sieht so aus, als ob einige Bibliotheken immer noch Notification und nicht NotificationCompat verwenden. – Koh

+1

Versuchen Sie, die von @rohitsakala vorgeschlagenen Änderungen zu implementieren, und aktualisieren Sie Ihre Support-Repository-, Bibliotheks- und Play-Dienste von Ihrem SDK-Manager. Hoffe das hilft. – Koh

Antwort

12

Entsprechend dieser link sollten Sie Schlüssel/Wert-Paar Symbol haben.

Überprüfen Sie den Symbolparameter der Benachrichtigungsnutzlast. Es ist wie erforderlich angegeben.

Sie müssen also ein Symbol in den JSON einfügen.

könnte ein Beispiel sein

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

myicon das Bild myicon.png in drawable Ordner in der Anwendung mit dem Namen ist.

onMessageReceived wird aufgerufen, wenn eine Nachricht mit data Nutzdaten empfangen wird. Wenn wir notification zu data (wie unten) im oben genannten json ändern, wird die onMessageReceived Funktion aufgerufen.

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

Dank @rohitsakala. Du hast den halben Teil meiner Frage gelöst. Nachdem ich wie oben auf 'json' gewechselt habe, bekomme ich die Benachrichtigung, aber die Funktion' onMessageReceived' wird nicht aufgerufen, wenn ich eine Benachrichtigung erhalte. Weißt du, warum? Wenn ich die Antwort für die obige Frage bekomme, werde ich sie als Antwort akzeptieren. –

+1

@Mahendran Sie müssen die Benachrichtigung in Daten in der obigen JSON für onMessageReceived geändert werden, um angerufen werden! Beispiel: - { "bis": "ci4ZzC4BW ....", "data": { "title": "Testing", "Körper": "Erfolg", "Symbol": „@drawable/myicon " } } und dann können Sie Ihre Benachrichtigung vom Benachrichtigungsersteller erstellen! – rohitsakala

+0

Ja @rohitsakala. das hat funktioniert. Nochmals vielen Dank .. –

0

begegne ich das gleiche Problem

Blick auf die Informationen in 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; 

und verweisen auf die API doc: http://developer.android.com/reference/android/app/Notification.Builder.html

search "setColor" Sie finden wird es hinzugefügt in "API level 21" bedeutet diese Methode funktioniert nur über 5.0 (Lollipop)

Ich habe versucht, die Struktur unter Test auf 2 verschiedenen OS-Gerät, 5.0 & 4.4 jeweils und nur auf 5 arbeiten.0

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

Hinweis: i verwenden, um die JSON-Test auf OS 5.0 wird Meldung angezeigt, aber onMessageReceived noch nicht

+0

Farbe ist nicht spezifisch in der Datennutzlast, also, da es optional ist, sollte dies kein Problem verursachen? Ich habe Probleme mit demselben Problem, muss aber Jellybean und spätere Versionen unterstützen –

0

Obwohl ein alter Thread aufgerufen, wollte ich dies hinzufügen auf basierend auf einige ähnliche Probleme Dem ich gegenübergestanden hatte.

Die App hat zwei Zustände: aktiv und inaktiv.

Wenn die App aktiv ist, würde das Senden einer notification ohne ein Symbol Wert (ich vermute, der Schlüssel ist immer noch erforderlich) würde immer noch funktionieren. Funktioniert für mich aber der Schlüssel ist immer noch da drin.

Mein JSON-Objekt sieht wie folgt aus:

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

Von Entwickler docs:

Für eine aktive Android-App Benachrichtigung Nutzlasten übergeben werden, um onMessageReceived() unter der Benachrichtigung Schlüssel in der Daten bündeln.

Wenn die App nicht aktiv ist:

Benachrichtigungen werden an den Infobereich geliefert, wenn die App inaktiv ist.

Und hier ist, wenn ich das Missing icon Problem treffe. Wenn die App inaktiv ist, ist ein Schlüssel-Wert-Paar erforderlich.

Wenn es sich bei der Nutzlast um eine Benachrichtigung handelt, stellen Sie sicher, dass sie immer das icon Schlüssel/Wert-Paar enthält, damit sie wie erwartet funktioniert, unabhängig davon, ob die App aktiv oder inaktiv ist.

See here for details

Schließlich sollte es eine klare Unterscheidung zwischen dem, was ein notification ist und was für ein data ist, bei der Gestaltung der Anwendung. Ich habe notification für alle Push-Nachrichten für meine Anwendung verwendet, was meiner Meinung nach nicht der richtige Weg ist.

Verwandte Themen