使用appengine实施Google Cloud Message

时间:2014-06-21 13:26:18

标签: android google-app-engine google-cloud-messaging

我正在尝试使用appengine实现GCM。我创建了默认的appengine后端+ GCM模板并进行了部署。 我创建了一个GCM注册ID:

GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
String regId = gcm.register(SENDER_ID);  //sender_id is my project number

然后我使用模板中的默认注册端点将此regID存储在appengine上。我的广播接收器看起来像这样:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.i("Ayush", "Received");

        // Explicitly specify that GcmIntentService will handle the intent.
        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);
    }
}

这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="reach.project" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <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" />
                <action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION" />
                <category android:name="reach.project" />
            </intent-filter>
        </receiver>
        <service android:name=".GcmIntentService" />

        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <permission
        android:name="reach.project.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <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" />
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />

</manifest>

BroadCastReceiver和intent服务是我项目中的单独类。 appengine后端+ GCM是一个单独的模块。 在创建此模块期间:

  

编译项目(路径:':app2',配置:'android-endpoints')

此行已自动附加到主模块的build.gradle。

  

package com.example.mymodule.app2,是我的路径   MessagingEndpoint。

当我注册设备时,我的广播接收器被激活,但是当我尝试从appspot.com网站或api资源管理器发送消息时,它没有收到任何信息。我可以确认正在分派消息,如后端的日志所示。 请帮忙。

我正在关注本教程: https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/GcmEndpoints

1 个答案:

答案 0 :(得分:0)

根据清单,您应用的应用包名称为reach.project

因此你应该改变

<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />

<uses-permission android:name="reach.project.permission.C2D_MESSAGE" />