2016-09-14 3 views
16

Ich erhalte diesen Fehler von Android Studio Android Monitor. Dieser Fehler tritt auf, wenn ich eine Push-Benachrichtigung über GCM in einem echten Gerät sende und die App noch nicht gestartet wurde oder zum Stoppen gezwungen wurde. Gestern funktioniert alles gut, heute funktioniert es überhaupt nicht mehr (funktioniert nur, wenn die App im Hintergrund oder Vordergrund läuft).Fehler Broadcast Intent Callback: Ergebnis = CANCELLED forintent {act = com.google.android.c2dm.intent.RECEIVE pkg = com.flagg327.guicomaipu (hat Extras)}

Ich denke, das kann ein AndroidManifest Fehler sein, aber ich bin es leid, auf der Suche nach dem Problem und kann nichts finden.

Manifest

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.flagg327.guicomaipu"> 

    ... 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     ... 

     <!--GOOGLE CLOUD MESSAGE--> 
     <receiver 
      android:name="com.google.android.gms.gcm.GcmReceiver" 
      android:exported="true" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <!-- for Gingerbread GSF backward compat --> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="com.flagg327.guicomaipu" /> 
      </intent-filter> 
     </receiver> 

     <service 
      android:name="com.flagg327.guicomaipu.gcm.RegistrationService" 
      android:exported="false" /> 

     <service 
      android:name="com.flagg327.guicomaipu.gcm.TokenRefreshListenerService" 
     android:exported="false"> 
      <intent-filter> 
       <action 
        android:name="com.google.android.gms.iid.InstanceID" /> 
      </intent-filter> 
     </service> 

     <service 
      android:name="com.flagg327.guicomaipu.gcm.NotificacionsListenerService" 
     android:exported="false" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      </intent-filter> 
     </service> 

    </aplication> 

    <permission 
     android:name="com.flagg327.guicomaipu.C2D_MESSAGE" 
      android:protectionLevel="signature" /> 
    <uses-permission android:name="com.flagg327.guicomaipu.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

TokenRefreshListenerService.java

jeden Tag Registrierung 'Token' Updates. Daher muss jede Android-App, die GCM verwendet, über einen InstanceIDListenerService verfügen, der diese Updates verwaltet.

public class TokenRefreshListenerService extends InstanceIDListenerService{ 

    @Override 
    public void onTokenRefresh() { 
     // Launch the registration process. 
     Intent i = new Intent(this, RegistrationService.class); 
     startService(i); 
    } 
} 

NotificacionsListenerService.java

GCM automatisch die Push-Benachrichtigungen zeigt, aber nur dann, wenn die zugeordnete Anwendung hat ein GCMListenerService

public class NotificacionsListenerService extends GcmListenerService { 

    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     Log.d("A", "onMessageReceived()"); 

     // Do something 

    } 
} 

RegistrationService.java

GCM identifiziert die Android-Geräte usin g Registrierungskarten ("Tokens"): Meine App sollte sich von jedem Android-Gerät aus registrieren können, auf dem sie installiert ist.

public class RegistrationService extends IntentService { 

    /** 
    * Constructor 
    */ 
    public RegistrationService() { 
     super("RegistrationService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Generate or download the registration 'token'. 
     InstanceID myID = InstanceID.getInstance(this); 

     String registrationToken = null; 
     try { 
      // Get the registration 'token'. 
      registrationToken = myID.getToken(
        getString(R.string.gcm_defaultSenderId), 
        GoogleCloudMessaging.INSTANCE_ID_SCOPE, 
        null 
      ); 

      // Subscribe to a topic. The app is able now to receive notifications from this topic. 
      GcmPubSub subscription = GcmPubSub.getInstance(this); 
      subscription.subscribe(registrationToken, "/topics/guico_maipu_topic", null); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Log.e("Registration Token", registrationToken); 
    } 
} 

Fehler

Dieser Fehler erscheint, wenn ich eine Push-Benachrichtigung über Python senden.

09-13 21:21:44.800 1851-1851/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.flagg327.guicomaipu (has extras) } 

Gestern funktionierte ... Irgendeine Idee? Als du für deine Zeit.

+0

von diesem [Thema] Basierend (https://groups.google.com/forum/#!msg/android-gcm/MqVlA3Sj26c/6O4TdU1pm0UJ) tritt dieses Problem auf, wenn die empfangende Anwendung in gestoppt ist Zustand am Gerät (z. B. mit Force Stop aus den Einstellungen). Es fängt erst an Nachrichten wieder zu empfangen, wenn es manuell gestartet wird. Sie können diese [verwandte SO Post] (http://stackoverflow.com/questions/11902947/broadcast-intent-callback-result-cancelled-forintent) auch überprüfen. – abielita

+0

Sloved dies überprüfen ..https: //stackoverflow.com/a/45810771/1993001 –

Antwort

7

Also ... Ich löste das Problem. Das Problem war, dass das Gerät nicht für den Empfang von GCM registriert ist, wenn die App geschlossen wurde oder wenn die App seit dem Start des Geräts nie geöffnet wurde. Die Lösung ist einfach, registrieren Sie das Gerät beim Telefonstart. Dazu habe ich eine BroadcastReceiver implementiert und eine Prozessregistrierung darin gestartet.

Die Modifikationen:

hinzugefügt AndroidManifest

<receiver android:name="com.flagg327.guicomaipu.gcm.OnBootBroadcastReceiver"> 
     <intent-filter > 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 

      <category android:name="android.intent.category.HOME" /> 
     </intent-filter> 
    </receiver> 

OnBootBroadcastReceiver.java

public class OnBootBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     Intent i = new Intent("com.flagg327.guicomaipu.gcm.RegistrationService"); 
     i.setClass(context, RegistrationService.class); 
     context.startService(i); 
    } 
} 

also beim Booten, wird das Gerät in den GCM-Server registrieren und los um Push-Benachrichtigungen von meinem Server empfangen zu können. Ich hoffe, es ist nützlich.

+0

Danke @ flagg327, ich war das gleiche Problem und lösen Sie es von Ihrem ans. –

+4

Funktioniert das, wenn wir zwingen, die App zu töten? –

7

bekam ich den gleichen Fehler

09-13 21:21:44.800 1851-1851/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.XXX.XXX (has extras) } 

nach der App zu töten.

Nach einiger Recherche wurde mir klar, dass dies nur ein "Debug-Issue" ist. Eine "signierte APK" behandelt die Übertragung korrekt, auch wenn die App heruntergefahren wurde.

Hoffe es hilft!

+5

hat es nicht für mich funktioniert. :( –

+0

Bitte verknüpfen Sie die Quellen für Ihre Ressource – natanavra

+0

@natanavra was meinst du? Die vollständige Quelle wurde in der ursprünglichen Frage - nicht wahr? – niggeulimann

3

Nachdem Sie herausgefunden haben, warum dies passiert, scheint es, dass es passiert, wenn Sie die App aus Android Studio beenden.

Wenn Sie die App über den Launcher öffnen und wegwischen, erhält Ihre App weiterhin Benachrichtigungen.

(Getestet auf OnePlus One mit FCM nicht GCM)

+1

Das hat mir sehr geholfen. – gorkem

0

ich auch mit der Frage konfrontiert wurde. Wenn ich die Anwendung vom Stapel entferne, wird die Push-Benachrichtigung nicht empfangen. Nach viel Google habe ich festgestellt, dass nur wenige Handys Batterie-Optimierung-Funktion haben, und dies wird Hintergrund-Lauf von Anwendungen deaktivieren. Wenn ich aktiviere, kann meine Anwendung auch im Hintergrund ausgeführt werden. Push-Benachrichtigung funktioniert gut. Nur wenige Anwendungen, wie z. B. Anwendungen usw., können nur die Standardaktivierungsfunktion haben. Sie können sich die folgende URL ansehen.

https://github.com/firebase/quickstart-android/issues/89

Verwandte Themen