Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Leaked IntentReceiver error when calling GCMRegistrar.register()

I'm trying to finish the getting started steps on Google's GCM from Google's Android Developer site.

When my device tries to register, it fails with the following reason:

Activity has leaked IntentReceiver from com.google.android.gcm.GCMBroadcastReceiver that was originally registered here. Are you missing a call to unregisterReceiver?

This is the code:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
    GCMRegistrar.register(this, senderId); // <-- It fails here
} else {
    Log.v("GCM", "Already registered");
}

Any idea?

What am I doing wrong?

Update

This is my manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <permission android:name="com.sample.permission.C2D_MESSAGE" android:protectionLevel="signature" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="com.sample.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <activity
            android:name=".sample"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:theme="@android:style/Theme.NoTitleBar" android:name=".Main" android:screenOrientation="portrait" />
        <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.sample" />
          </intent-filter>
        </receiver>               
        <service android:name="com.sample.GCMIntentService" />
        <uses-library android:name="com.google.android.maps" />
    </application>

</manifest>
like image 992
histeria Avatar asked Jun 30 '12 23:06

histeria


2 Answers

Finally it works.

All I need to do is call to GCMRegistrar.onDestroy(this) in the onDestroy() method in the same Context I'm calling GCMRegistrar.register()

Found here: Leaked IntentReceiver in Google Cloud Messaging

Thanks for your support :)

like image 144
histeria Avatar answered Oct 20 '22 03:10

histeria


You should use the application context, instead of the activity context like below:

public String registerPushAccount()
{
    GCMRegistrar.checkDevice(getApplicationContext());
    GCMRegistrar.checkManifest(getApplicationContext());
    if (GCMRegistrar.isRegistered(getApplicationContext()))
    {
        Log.d("info", GCMRegistrar.getRegistrationId(getApplicationContext()));
    }
    String regId = GCMRegistrar.getRegistrationId(getApplicationContext());
    if (regId.equals(""))
    {
        regId = GCMRegistrar.getRegistrationId(getApplicationContext());
    }
    else
    {
        Log.d("info", "already registered as" + regId);
    }
    Log.d("info", regId);
    return regId;
}

This solved my problem.:)

like image 2
Vinay Avatar answered Oct 20 '22 03:10

Vinay