推送Androïd的通知

时间:2014-08-21 08:58:26

标签: android debugging notifications push-notification

我创建了一个我想要实现推送通知的应用程序。 感谢许多教程,我创建了服务器部分和客户端部分。

在服务器部分,我使用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);        
}

我该如何调试?或者有任何明显的原因吗?

2 个答案:

答案 0 :(得分:2)

在设备上,您需要执行以下步骤:

  1. 注册GoogleCloudMessaging。

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String gcmRegistrationId = gcm.register();

  2. 将步骤1中获取的gcmRegistrationId发送到服务器。服务器将使用此ID发送GCM tickle。

  3. 注册GCM接收器。 将其添加到AndroidManifest.xml中,如下所示:

  4. <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和其他平台的工作应用程序的教程和示例。

http://aerogear.org/

https://github.com/aerogear/aerogear-push-helloworld/tree/master/android

祝你好运!推送通知需要一些时间,但不是因为复杂性,而是因为您需要做的事情。