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);
}
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>
Here's what you have to do :
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"
...
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With