2012-06-30 14 views
5

Estoy intentando finalizar los pasos iniciales en Google's GCM del sitio para desarrolladores de Android de Google.Error filtrado de IntentReceiver al llamar a GCMRegistrar.register()

Cuando el dispositivo intenta registrar, se produce el siguiente motivo:

actividad se ha filtrado desde IntentReceiver com.google.android.gcm.GCMBroadcastReceiver que fue originalmente registrado aquí. ¿Te estás perdiendo una llamada para cancelar el registro de Receptor?

Este es el código:

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"); 
} 

Alguna idea?

¿Qué estoy haciendo mal?

actualización

Ésta es mi manifiesto:

<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> 
+0

Solo supongo, ¿tienes la clase GCMIntentService en tu proyecto, y esta clase tiene el nombre del paquete com.sample.GCMIntentService? – azgolfer

Respuesta

12

Finalmente funciona.

Todo lo que necesito hacer es llamar a GCMRegistrar.onDestroy(this) en el método onDestroy() en el mismo contexto que estoy llamando GCMRegistrar.register()

encontrado aquí: Leaked IntentReceiver in Google Cloud Messaging

Gracias por su apoyo :)

0

Esto sucedió a mí cuando no configuró correctamente mis permisos. Lo resuelto mediante la adición en el manifiesto:

<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" /> 
+0

Ya tengo estos permisos en el manifiesto, pero sigue fallando – histeria

+0

¿puede publicar su manifiesto? – hyotam

+0

Claro. He actualizado mi publicación – histeria

0

Tengo que trabajar con este manifiesto:

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

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

    <permission android:name="PACKAGENAME.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
    <uses-permission android:name="PACKAGENAME.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <permission android:name="android.permission.WAKE_LOCK" android:protectionLevel="signatureOrSystem"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <service android:name="PACKAGENAME.GCMIntentService" /> 
     <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="PACKAGENAME" /> 
    </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> 

también añaden un constructor vacío a su clase que se extiende desde GCMBaseIntentService. En mi caso llamado: GCMIntentService.

+0

¿Qué ID de remitente le pasa al constructor no-arg al superconstructor? GCMBaseIntentService() no tiene un constructor no-arg propio. – jph

+0

Identificación del proyecto del proyecto google api – Klaasvaak

2

Usted debe utilice el contexto de la aplicación, en lugar del contexto de la actividad como se muestra a continuación:

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; 
} 

Esto resolvió mi problema :)

Cuestiones relacionadas