2016-09-14 33 views
16

Otrzymuję ten błąd z Android Monitor Androida Studio. Ten błąd pojawia się, gdy wysyłam powiadomienie push przez GCM, w rzeczywistym urządzeniu, a aplikacja nie została jeszcze uruchomiona lub została zmuszona do zatrzymania. Wczoraj wszystko działa dobrze, dziś nie działa wcale (działa tylko wtedy, gdy aplikacja działa w tle lub na pierwszym planie).Komunikat o błędzie: callback: result = ANULOWANO forIntent {act = com.google.android.c2dm.intent.RECEIVE pkg = com.flagg327.guicomaipu (ma dodatki)}

Myślę, że to może być błąd AndroidManifest, ale jestem zmęczony szukaniem problemu i nie mogę znaleźć niczego.

Oczywisty

<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

aktualizacje rejestracji 'znaków' codziennie. To dlatego, że każda aplikacja na Androida, która korzysta z GCM, musi mieć InstanceIDListenerService, która zarządza tymi aktualizacjami.

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 automatycznie pokazuje się z powiadomień push, ale tylko wtedy, gdy wiąże się aplikacja ma GCMListenerService

public class NotificacionsListenerService extends GcmListenerService { 

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

     // Do something 

    } 
} 

RegistrationService.java

GCM identyfikuje urządzenia z Androidem g karty rejestracyjne ("tokeny"). Moja aplikacja powinna być w stanie rejestrować się z każdego urządzenia z systemem Android, na którym jest zainstalowana.

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

Błąd

Ten błąd pojawia się, gdy mogę wysłać powiadomienia wypychania przez pytona.

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

Wczoraj pracował ... Masz pomysł? Niż za twój czas.

+0

podstawie z tym gwintem [] (https://groups.google.com/forum/#!msg/android-gcm/MqVlA3Sj26c/6O4TdU1pm0UJ) Problem ten występuje wtedy, gdy aplikacja odbiorczy jest zatrzymany stan na urządzeniu (na przykład za pomocą wymuszonego zatrzymania z ustawień). Zacznie otrzymywać wiadomości tylko wtedy, gdy zostaną uruchomione ręcznie. Możesz również sprawdzić ten [powiązany wpis SO] (http://stackoverflow.com/questions/11902947/broadcast-intent-callback-result-cancelled-forintent). – abielita

+0

Sloved Sprawdź to ..https: //stackoverflow.com/a/45810771/1993001 –

Odpowiedz

7

Więc ... Rozwiązałem problem. Problem polegał na tym, że urządzenie nie zostało zarejestrowane, aby odebrać GCM, jeśli aplikacja zostanie zamknięta lub jeśli aplikacja nie została otwarta od momentu uruchomienia urządzenia. Rozwiązanie jest proste, zarejestruj urządzenie podczas rozruchu telefonu. W tym celu zaimplementowałem BroadcastReceiver i rozpocząłem rejestrację procesu wewnątrz niego.

Modyfikacje:

Dodany do 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); 
    } 
} 

więc na starcie, urządzenie zarejestruje się na serwerze GCM i dzieje aby móc otrzymywać powiadomienia push z mojego serwera. Mam nadzieję, że jest to przydatne.

+0

Dzięki @ flagg327, Byłem ten sam problem i rozwiązać go przez ans. –

+4

Czy to działa, gdy wymuszamy wyłączenie aplikacji? –

7

Mam ten sam błąd

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

po zabiciu aplikację.

Po kilku badaniach zdałem sobie sprawę, że jest to tylko "kwestia debugowania". "Podpisany plik APK" poprawnie obsługuje transmisję, nawet jeśli aplikacja została zamknięta.

Mam nadzieję, że pomoże!

+5

to nie zadziałało dla mnie. :( –

+0

Proszę połączyć źródła dla zasobu – natanavra

+0

@natanavra, co masz na myśli? Pełne źródło było w pierwotnym pytaniu - czyż nie? – niggeulimann

3

Po sprawdzeniu, dlaczego tak się dzieje, wygląda na to, że zdarza się, gdy zabijesz aplikację z Android Studio.

Jeśli otworzysz aplikację z poziomu programu uruchamiającego i odrzucisz ją, Twoja aplikacja będzie nadal otrzymywać powiadomienia.

(Testowane na OnePlus Jeden z FCM nie GCM)

+1

Bardzo mi to pomogło. – gorkem

0

Byłem też stoi problem. Kiedy usuwam aplikację ze stosu, powiadomienie push nie jest odbierane. Po wielu Google odkryłem, że kilka telefonów ma funkcję optymalizacji baterii, co wyłącza uruchamianie aplikacji w tle. Kiedy włączam, że moja aplikacja może również działać w tle. Powiadomienie push działa poprawnie. Tylko kilka aplikacji takich jak What's application etc może mieć tylko domyślną funkcję enable. Możesz rzucić okiem na poniższy adres URL.

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