从库项目注册 GCM [英] Register GCM from a library project
问题描述
我正在尝试从库项目注册到 GCM,GCMIntentService 是在库项目中定义的.
I am trying to register to GCM from a library project the GCMIntentService is defined inside the library project.
这是我的注册码(在库项目中):
Here is my registration code(inside the library project):
public static void init(Context context, String id){
GCMRegistrar.checkDevice(context);
GCMRegistrar.checkManifest(context);
GCMRegistrar.register(context, id);
}
但是没有调用 GCMIntentService 的回调,只有当我将库项目作为独立的 android 项目运行时才会调用它们.
But the callbacks of the GCMIntentService are not being called, they are being called only when I run the library project as standalone android project.
这是我的测试项目清单:
Here is my test project manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.pushtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<permission
android:name="com.example.pushtest.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- GCM requires a Google account. -->
<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.pushtest.permission.C2D_MESSAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name=".PushTestApp" >
<activity
android:name="com.example.pushtest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.google.android.gcm.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.example.pushtest" />
</intent-filter>
</receiver>
</application>
//push library definition
<service android:name="com.test.pushlibrary.GCMIntentService" />
</manifest>
推荐答案
这是你必须做的:
编写一个覆盖 GCMBroadcastReceiver 的类(在您的库项目中):
Write a class (in your library project) that overrides GCMBroadcastReceiver :
package com.test.pushlibrary;
import android.content.Context;
import com.google.android.gcm.GCMBroadcastReceiver;
public class PushLibraryBroadcastReceiver extends GCMBroadcastReceiver
{
/**
* Gets the class name of the intent service that will handle GCM messages.
*/
@Override
protected String getGCMIntentServiceClassName(Context context) {
return "com.test.pushlibrary.GCMIntentService";
}
}
更改您的清单以引用新的接收器:
Change your manifest to refer to the new receiver :
<receiver
android:name="com.test.pushlibrary.PushLibraryBroadcastReceiver"
...
您的原始代码不起作用的原因是 getGCMIntentServiceClassName
的默认实现假定意图服务类位于应用程序的包中,因此它期望 com.example.pushtest.GCMIntentService
而不是 com.test.pushlibrary.GCMIntentService
.
The reason that your original code didn't work is that the default implementation of getGCMIntentServiceClassName
assumes that the intent service class is located in the package of the application, so it's expecting com.example.pushtest.GCMIntentService
instead of com.test.pushlibrary.GCMIntentService
.
这篇关于从库项目注册 GCM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!