我正在尝试使用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
答案 0 :(得分:0)
根据清单,您应用的应用包名称为reach.project
。
因此你应该改变
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
到
<uses-permission android:name="reach.project.permission.C2D_MESSAGE" />