Possible Duplicate:
Android RuntimeException: Unable to instantiate the service
Trying to get GCM up and running but my device is sending a registration request, but getting no response back from the GCM server. Below I included my manifest and GCMIntentService definition, and my call to register with the GCM server. I've been staring at it so long I might be missing something obvious, if so I apologize.
All ideas welcome!
Here is my manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="PACKAGE"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<permission android:name="PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="PACKAGE.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<service android:name=".GCMIntentService"
android:enabled="true"/>
<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="PACKAGE.GCMIntentService" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Here is my GCMIntentService to handle the return from GCM:
import com.google.android.gcm.GCMBaseIntentService;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class GCMIntentService extends GCMBaseIntentService {
public static String TAG = "GCMIntentService";
public GCMIntentService(String senderId) {
super(senderId);
Log.d("GCMIntentService", senderId);
}
@Override
protected void onError(Context arg0, String arg1) {
Log.d("onError", arg1);
}
@Override
protected boolean onRecoverableError(Context context, String errorId){
Log.d("onRecoverableError", errorId);
return false;
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Log.d("onMessage", String.valueOf(arg1));
}
@Override
protected void onRegistered(Context arg0, String arg1) {
Log.d("onRegistered", arg1);
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
Log.d("onUnregistered", arg1);
}
}
I attempt to register with the following in the onCreate method of my main class:
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.d(TAG, "Already registered");
}
UPDATE I have tried Raz's suggestion and I got the following error:
07-03 12:07:40.459: W/dalvikvm(341): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
07-03 12:07:40.508: E/AndroidRuntime(341): FATAL EXCEPTION: main
07-03 12:07:40.508: E/AndroidRuntime(341): java.lang.RuntimeException: Unable to instantiate service package.gcm2.GCMIntentService: java.lang.InstantiationException: package.gcm2.GCMIntentService
07-03 12:07:40.508: E/AndroidRuntime(341): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2943)
07-03 12:07:40.508: E/AndroidRuntime(341): at android.app.ActivityThread.access$3300(ActivityThread.java:125)
07-03 12:07:40.508: E/AndroidRuntime(341): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2087)
07-03 12:07:40.508: E/AndroidRuntime(341): at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 12:07:40.508: E/AndroidRuntime(341): at android.os.Looper.loop(Looper.java:123)
07-03 12:07:40.508: E/AndroidRuntime(341): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-03 12:07:40.508: E/AndroidRuntime(341): at java.lang.reflect.Method.invokeNative(Native Method)
07-03 12:07:40.508: E/AndroidRuntime(341): at java.lang.reflect.Method.invoke(Method.java:521)
07-03 12:07:40.508: E/AndroidRuntime(341): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-03 12:07:40.508: E/AndroidRuntime(341): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-03 12:07:40.508: E/AndroidRuntime(341): at dalvik.system.NativeStart.main(Native Method)
07-03 12:07:40.508: E/AndroidRuntime(341): Caused by: java.lang.InstantiationException: package.gcm2.GCMIntentService
07-03 12:07:40.508: E/AndroidRuntime(341): at java.lang.Class.newInstanceImpl(Native Method)
07-03 12:07:40.508: E/AndroidRuntime(341): at java.lang.Class.newInstance(Class.java:1429)
07-03 12:07:40.508: E/AndroidRuntime(341): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2940)
07-03 12:07:40.508: E/AndroidRuntime(341): ... 10 more
07-03 12:08:34.560: I/Process(341): Sending signal. PID: 341 SIG: 9
In your manifest try this:
<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="eimmer.liav.elucidate.gcm2" />
</intent-filter>
</receiver>
If the service is in the same package name the leave it like you did else change it to your real package instead of .GCMIntentService
but then you would also need to extend
and override
the GCMBroadcastReceiver
.
If your package is not eimmer.liav.elucidate.gcm2.GCMIntentService
then you must extend GCMBroadcastReceiver and override the function getGCMIntentServiceClassName().
In that function return the real package and class in string example: eimmer.liav.example.GCMIntentService
.
Also don't forget to change the receiver name to the new one. example:
<receiver
android:name="eimmer.liav.example.MyGCMBroadcastReceiver"
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="eimmer.liav.elucidate.gcm2" />
</intent-filter>
</receiver>
Further more change your service name to:
<service android:name="eimmer.liav.example.GCMIntentService"
android:enabled="true"/>
One other thing according to Google you need to change your constructor to default one and send some string like this:
public GCMIntentService() {
super("Test");
}
The string is not really important as far as I know.
Have fun.
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