I am trying to register my app on GCM but I don't know why my app is never registered. GCMRegistrar.register(this, SENDER_ID);
is called but onRegistered() from my GCMIntentService is never called. I don't know WHY.
This is my Logcat
01-17 11:03:00.015: D/GCMRegistrar(3509): resetting backoff for com.abc.xyz.ui.activity
01-17 11:03:03.210: V/GCMRegistrar(3509): Registering app com.abc.xyz.ui.activity of senders 964256581311
01-17 11:03:06.070: V/GCMBroadcastReceiver(3509): onReceive: com.google.android.c2dm.intent.REGISTRATION
01-17 11:03:06.070: V/GCMBroadcastReceiver(3509): GCM IntentService class: com.abc.xyz.ui.activity.GCMIntentService
01-17 11:03:06.070: V/GCMBaseIntentService(3509): Acquiring wakelock
and this is my complete manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.abc.xyz.ui.activity"
android:versionCode="1"
android:versionName="1.5.6" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk
android:minSdkVersion="11" android:targetSdkVersion="16"/>
<uses-feature
android:name="android.hardware.usb.host"/>
<!-- This app has permission to register and receive data message. -->
<uses-permission
android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE" />
<uses-permission
android:name="android.permission.GET_TASKS" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
android:name="android.permission.CALL_PHONE" />
<uses-permission
android:name="android.permission.BLUETOOTH" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--
Creates a custom permission so only this app can receive its messages.
NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,
where PACKAGE is the application's package name.
-->
<uses-permission
android:name="com.abc.xyz.ui.activity.permission.C2D_MESSAGE" />
<permission
android:name="com.abc.xyz.ui.activity.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light"
android:name="com.abc.xyz.MyApplication"
android:allowBackup="false">
<activity
android:name=".StartupActivity"
android:noHistory="true"
android:label="@string/title_startup_screen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".LoginActivity"
android:windowSoftInputMode="stateAlwaysVisible|adjustResize"
android:label="@string/title_login_screen"
android:configChanges="orientation">
</activity>
//my other activity defination
<!--
BroadcastReceiver that will receive intents from GCM
services and handle them to the custom IntentService.
The com.google.android.c2dm.permission.SEND permission is necessary
so only GCM services can send data messages for the app.
-->
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.abc.xyz.ui.activity" />
</intent-filter>
</receiver>
<!--
Application-specific subclass of GCMBaseIntentService that will
handle received messages.
By default, it must be named .GCMIntentService, unless the
application uses a custom BroadcastReceiver that redefines its name.
-->
<service android:name="com.abc.xyz.ui.activity.GCMIntentService" />
</application>
</manifest>
I don't know what is wrong and why onRegistered() is never called. Any help will be appreciated.
I figured out in another post what is the problem. My GCMIntentService Class was defined in my manifest as
<service android:name="MY_PACKAGE.gcm.GCMIntentService" />
because I didn't want to put this class at the root package, instead I put at MY_PACKAGE.gcm". This seems to cause a problem and as the documentation says,
Add the following intent service
<service android:name=".GCMIntentService" />
So when I moved to the root package it worked! There is another way to put the GCMIntentServiceSubclass wherever you want and name it differently. You should subclass GCMBroadcastReceiver and do the changes in manifest and in the subclass as shown in this other post.
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