未收到 GCM 推送通知(已完成所有操作)



在你把它指出为重复项之前,我知道这已经被问了很多次,但似乎在新的 GCM(要求将 Play 服务项目作为库包含)推出后,关于如何在我们的代码中正确实现 gcm,事情发生了变化。

我的GCMIntentService.javaGcmBroadcastReceiver.java中的断点在寄存器上被命中,因为我在清单中设置了<action android:name="com.google.android.c2dm.intent.REGISTRATION" />,但当我从服务器发送推送时,断点不会被命中。以下是您需要的所有内容:

相关AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.aceast.waveindia"
    android:versionCode="1"
    android:versionName="waveindia1" >
    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="11" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission
        android:name="com.aceast.waveindia.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

 <!-- App receives GCM messages. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <!-- GCM connects to Google Services. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

        <receiver
            android:name=".GcmBroadcastReceiver"
            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" />
                <category android:name="com.aceast.waveindia" />
            </intent-filter>
        </receiver>
        <service android:name=".GcmIntentService" />

GCMBroadcastReceiver.java

    public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Explicitly specify that GcmIntentService will handle the intent.
//breakpoint gets hit on register here...
            ComponentName comp = new ComponentName(context.getPackageName(),
                    GcmIntentService.class.getName());
            // Start the service, keeping the device awake while it is launching.
            startWakefulService(context, (intent.setComponent(comp)));
            setResultCode(Activity.RESULT_OK);
        }
    }

断点命中register的 GCMIntentService 的一部分

 @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
        // The getMessageType() intent parameter must be the intent you received
        // in your BroadcastReceiver.
        String messageType = gcm.getMessageType(intent);

触发推送的.NET code

public string SendNotification()
    {
        var value = Message;
        WebRequest tRequest;
        tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
        tRequest.Method = "post";
        tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8";
       // tRequest.ContentType = " application/json;charset=UTF-8";
        tRequest.Headers.Add(string.Format("Authorization: key={0}", GOOGLE_APPID));
        tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
        string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "&registration_id=" + DeviceID + "";
        Console.WriteLine(postData);
        Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        tRequest.ContentLength = byteArray.Length;
        Stream dataStream = tRequest.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
        WebResponse tResponse = tRequest.GetResponse();
        dataStream = tResponse.GetResponseStream();
        StreamReader tReader = new StreamReader(dataStream);
        String sResponseFromServer = tReader.ReadToEnd();

        tReader.Close();
        dataStream.Close();
        tResponse.Close();
        return sResponseFromServer;
    }

本地防火墙已解锁 5228-5230 端口

现在你能指出错误吗?

我在您的清单中看到一个问题:

<uses-permission
    android:name="com.aceast.waveindia.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

应该是 :

<permission android:name="com.aceast.waveindia.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.aceast.waveindia.permission.C2D_MESSAGE" />

最新更新