Register GCM from the library project

I am trying to register with GCM from a library project. 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 GCMIntentService callbacks are not called, they are called only when I start the library project as a separate android project.

Here is my 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> 
+4
source share
1 answer

Here is what you need to do:

Write a class (in the 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 contact the new recipient:

  <receiver android:name="com.test.pushlibrary.PushLibraryBroadcastReceiver" ... 

The reason your source code didn't work is because the default implementation of getGCMIntentServiceClassName assumes that the class of service of intent is in the application package, so it expects com.example.pushtest.GCMIntentService instead of com.test.pushlibrary.GCMIntentService .

+14
source

Source: https://habr.com/ru/post/1246839/


All Articles