我正在尝试在Android应用程序中使用GCM实现推送通知。我创建了一个服务器来成功地将消息推送到设备,还创建了一个api来成功地将设备令牌存储在服务器中。基于link在sample project中提到的应用程序中创建了一个客户端。并且还在php中创建了一个函数来将通知推送到App。当我在服务器中运行该功能时,我得到的响应就是成功。这意味着消息从gcm发送到移动设备。但是没有显示通知,而是在log cat中获得以下内容。
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
捕获消息我正在使用示例应用程序中表示的相同侦听器服务(我在下面添加了参考)。所以我在通知管理器中想到了这个问题。所以我评论它并运行应用程序。但我再次收到相同的回复,没有任何通知。我不知道是什么问题。
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);
}
}
但是无论何时从服务器收到消息,都必须在上面的监听器中调用onMessageReceived
。在onMessageReceived
函数中,有两个日志记录功能来显示消息和发送者。那也没有执行。这意味着函数本身没有执行。下面我添加了清单内容。
<?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>
现在我还无法调试问题所在。我做错了什么或者我错过了什么?
答案 0 :(得分:12)
根据此link,您应该拥有键/值对图标。
检查通知有效负载的图标参数。它是根据需要指定的。
因此,您必须在JSON中包含一个图标。
一个例子可能是
{
"to":
"ci4ZzC4BW....",
"notification": {
"title": "Testing",
"body": "Success",
"icon": "@drawable/myicon"
}
}
myicon
是应用程序中myicon.png
文件夹中名为drawable
的图片。
onMessageReceived
有效负载的消息时,将调用 data
。当我们在上面的json中将notification
更改为data
(如下所示)时,将调用onMessageReceived
函数。
{
"to":
"ci4ZzC4BW....",
"data": {
"title": "Testing",
"body": "Success",
"icon": "@drawable/myicon"
}
}
答案 1 :(得分:0)
我遇到同样的问题
查看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;
并参考API文档: http://developer.android.com/reference/android/app/Notification.Builder.html
搜索&#34; setColor&#34;你会发现它在&#34; API级别21&#34;中添加,意味着此方法仅适用于5.0(Lollipop)
我在2个不同的OS设备,5.0&amp;分别为4.4,仅适用于5.0
{"to": "/topics/global","data": {"message": "<message>"},"notification": {"icon": "ic_stat_ic_notification","body": "Use Gradle Command","title": "Self test"}}
注意: 我在OS 5.0上使用JSON测试,显示通知,但仍未调用onMessageReceived
答案 2 :(得分:0)
虽然这是一个老话题,但我想根据我遇到的一些类似问题加入这个问题。
该应用有两种状态:有效和无效。
如果该应用处于有效状态,则发送notification
没有图标值(我怀疑仍然需要该密钥)仍然有效。适合我,但关键还在那里。
我的JSON对象如下所示:
.., icon=, sound=default, title=Bruce...
来自开发者文档:
对于有效的Android应用,会将通知有效内容传递给 数据包中的通知键下的onMessageReceived()。
当应用处于非活动状态时:
应用时,通知会发送到通知托盘 不活动的。
这是我遇到Missing icon
问题的时候。因此,如果应用处于非活动状态,则需要键和值对。
如果有效负载是通知,请确保它始终具有icon
键/值对,以便无论应用处于活动状态还是非活动状态,它都将按预期工作。
最后,在应用程序的设计中,应该明确区分notification
和data
是什么。我一直在使用notification
为我的应用程序提供所有推送消息,我认为这不是正确的方法。