我创建了一个我想要实现推送通知的应用程序。 感谢许多教程,我创建了服务器部分和客户端部分。
在服务器部分,我使用cURL发送POST请求(在PHP中)。
服务器响应:{"multicast_id":5560733296047502303,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1408610711700937%6f027011f9fd7ecd"}]}
但我手机上没有收到通知。
在申请表中,我有一项服务: 的manifest.xml
<service android:name=".GCMIntentService" />
所有需要的权限。
GCMIntentService.java
protected void onMessage(Context context, Intent intent) {
int icon = R.drawable.ic_launcher;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);
String title = context.getString(R.string.app_name);
Intent notificationIntent = new Intent(context, MainActivity.class);
// set intent so it does not start a new activity
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent =
PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
// Play default notification sound
notification.defaults |= Notification.DEFAULT_SOUND;
//notification.sound = Uri.parse("android.resource://"+ context.getPackageName()+ "your_sound_file_name.mp3");
// Vibrate if vibrate is enabled
notification.defaults |= Notification.DEFAULT_VIBRATE;
notificationManager.notify(0, notification);
}
我该如何调试?或者有任何明显的原因吗?
答案 0 :(得分:2)
在设备上,您需要执行以下步骤:
注册GoogleCloudMessaging。
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String gcmRegistrationId = gcm.register();
将步骤1中获取的gcmRegistrationId发送到服务器。服务器将使用此ID发送GCM tickle。
注册GCM接收器。 将其添加到AndroidManifest.xml中,如下所示:
<receiver android:name="com.hp.msa.receiver.GCMReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> </intent-filter> </receiver>
GCMReceiver.java将如下所示:
public class GCMReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Here, you will get actual PUSH notification.
// After receiving it, you can perform your tasks
// Intent contains data sent by server
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
// The getMessageType() intent parameter must be the intent you received
// in your BroadcastReceiver.
String messageType = gcm.getMessageType(intent);
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
// Logic
} else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
// Logic
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
// Logic
}
}
}
答案 1 :(得分:0)
发送和接收推送通知的过程相当复杂,因为涉及多方。如果您使用谷歌服务器广播您的请求(我认为您应该这样做),请确保您的服务器IP已添加到谷歌API控制台中的推送通知。如果您的手机正在使用推送服务器进行注册,则应在发送推送后的一分钟内收到某种意图。您可以尝试调试它,将手机连接到PC,连接调试器,删除所有过滤器,并在IDE的调试控制台中查找可能是谷歌推送通知的任何意图。如果您收到任何,则表示您的申请无法接收注入的意图。
您可以结帐aerogear项目,该项目提供了一个现成的推送服务器,可以注册电话安装并将通知转发给谷歌服务器。它还提供用于管理服务器的基本Web控制台。 Aerogear网站还包含许多针对Android和其他平台的工作应用程序的教程和示例。
https://github.com/aerogear/aerogear-push-helloworld/tree/master/android
祝你好运!推送通知需要一些时间,但不是因为复杂性,而是因为您需要做的事情。