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