Come risolvere l'errore di logging di Google Cloud Messaging: SERVICE_NOT_AVAILABLE?

Ho riscontrato un problema strano: ho usato GCM nella mia applicazione per un bel po 'di tempo e tutto funziona perfettamente. Tuttavia, prima di rilasciare Google Play, ho cambiato il nome del pacchetto di applicazioni da com.android.testapp a com.android.receachtion e dopo che questo GCM ha smesso di funzionare. All'inizio ho ottenuto l'errore di errore GCM sender id not set on constructor getSenderIds(Context context) GCM sender id not set on constructor e lo ho risolto getSenderIds(Context context) , ma ora non riesco a get un ID di logging. Ecco i messaggi di logcat: immettere qui la descrizione dell'immagine

Come posso risolvere questo problema? Quando ho passato a un nuovo pacchetto ho cambiato tutto nel file manifesto nel nuovo pacchetto:

  • ViewPager all'interno del frammento, come mantenere lo stato?
  • Cancellazione del database delle applicazioni
  • Come utilizzare onPause con Android?
  • JSON parsing in android: nessun valore per errore x
  • Come call un webservice di json tramite android
  • Aggiungi listener onlongclick ad un dialogo di avviso
  •  <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.android.receachtion" /> </intent-filter> </receiver> 

    Allora qual è il problema dietro questo? Può il rinominare il pacchetto di applicazioni causare questo o c'è un altro motivo?

  • Come utilizzare Blend per rendere trasparente un poligono?
  • "Perché Apache Harmony" o "Come utilizzare Java 8 su Android"
  • come get la window di attivitàToken senza vista?
  • Come cambiare il block di orientamento in android?
  • Data / ora Android visualizza 0 invece di 12
  • Accesso alle risorse senza un context
  • 15 Solutions collect form web for “Come risolvere l'errore di logging di Google Cloud Messaging: SERVICE_NOT_AVAILABLE?”

    Questo errore SERVICE_NOT_AVAILABLE indica che il GCM Service non è disponibile nella versione corrente. Aspetta e prova dopo qualche tempo.

    Questo accade molto tempo (come la mia esperienza), quindi non preoccuparti.


    Vedere la class GCMConstants di GCM Lib.

     /** * The device can't read the response, or there was a 500/503 from the * server that can be retried later. The application should use exponential * back off and retry. */ public static final String ERROR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE"; 

    Per ulteriori informazioni, vedere il handleRegistration() di GCMBaseIntentService

     private void handleRegistration(final Context context, Intent intent) { String registrationId = intent.getStringExtra(EXTRA_REGISTRATION_ID); String error = intent.getStringExtra(EXTRA_ERROR); String unregistered = intent.getStringExtra(EXTRA_UNREGISTERED); Log.d(TAG, "handleRegistration: registrationId = " + registrationId + ", error = " + error + ", unregistered = " + unregistered); // registration succeeded if (registrationId != null) { GCMRegistrar.resetBackoff(context); GCMRegistrar.setRegistrationId(context, registrationId); onRegistered(context, registrationId); return; } // unregistration succeeded if (unregistered != null) { // Remember we are unregistered GCMRegistrar.resetBackoff(context); String oldRegistrationId = GCMRegistrar.clearRegistrationId(context); onUnregistered(context, oldRegistrationId); return; } // last operation (registration or unregistration) returned an error; Log.d(TAG, "Registration error: " + error); // Registration failed if (ERROR_SERVICE_NOT_AVAILABLE.equals(error)) { boolean retry = onRecoverableError(context, error); if (retry) { int backoffTimeMs = GCMRegistrar.getBackoff(context); int nextAttempt = backoffTimeMs / 2 + sRandom.nextInt(backoffTimeMs); Log.d(TAG, "Scheduling registration retry, backoff = " + nextAttempt + " (" + backoffTimeMs + ")"); Intent retryIntent = new Intent(INTENT_FROM_GCM_LIBRARY_RETRY); retryIntent.putExtra(EXTRA_TOKEN, TOKEN); PendingIntent retryPendingIntent = PendingIntent .getBroadcast(context, 0, retryIntent, 0); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + nextAttempt, retryPendingIntent); // Next retry should wait longer. if (backoffTimeMs < MAX_BACKOFF_MS) { GCMRegistrar.setBackoff(context, backoffTimeMs * 2); } } else { Log.d(TAG, "Not retrying failed operation"); } } else { // Unrecoverable error, notify app onError(context, error); } } 

    Il problema è risolto, nel mio caso era poco più complicato.

    1. Controllare di avere una connessione internet triggers
    2. Verifica che tu abbia l'authorization Internet nel tuo manifesto
    3. Assicurati che il nome del pacchetto sia corretto come menzionato da Eran
    4. Il tempo del dispositivo è impostato correttamente. Anche se tutto è perfetto, non functionrà se l'orologio del dispositivo non è impostato correttamente.

    L'orologio sbagliato ha causato problemi per me. ๐Ÿ™‚

    Assicurati di aver modificato il nome del pacchetto nella parte autorizzazioni del tuo manifesto:

     <permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" /> 

    Ho avuto un errore simile a causa di un nome pacchetto errato in quella parte.

    SERVICE_NOT_AVAILABLE è uno dei problemi più frustranti con Google Cloud Messaging. È un'exception lanciata da GoogleCloudMessaging.register(SENDER_ID) , la function chiamata che registra il dispositivo per le notifiche push e restituisce un ID di logging.

    1. SERVICE_NOT_AVAILABLE potrebbe significare che il dispositivo dell'utente non è in grado di leggere la risposta alla richiesta di logging o un codice di errore 500/503 è stato restituito dal server. Gli sviluppatori non hanno alcun modo per risolvere questo errore perché è alla fine di Google, quindi possiamo suggerire ciecamente che l'utente dovrebbe riprovare in poche ore.
    2. SERVICE_NOT_AVAILABLE può verificarsi su alcuni dispositivi anche se la logging è rioutput. Ciò può essere risolto mediante l'implementazione di un ricevitore di radiodiffusione per acquisire il token quando la chiamata non riesce. Ho implementato questa soluzione e potrebbe aver risolto il problema per alcuni utenti, ma ho ricevuto molte altre denunce SERVICE_NOT_AVAILABLE.
    3. SERVICE_NOT_AVAILABLE potrebbe verificarsi a causa di una libreria di Google Play Services obsoleta o mancante sul dispositivo. In questo caso, l'applicazione potrebbe teoricamente informare l'utente per aggiornare Google Play Services aprendo il rispettivo elenco di app Google Play. Tuttavia, l'applicazione non ha idea che questo è il motivo per cui SERVICE_NOT_AVAILABLE è stato gettato, quindi non può redirect ciecamente l'utente alla pagina app di Google Play Services su Google Play.
    4. SERVICE_NOT_AVAILABLE può verificarsi quando l'orologio del dispositivo non è sincronizzato con la networking. Di nuovo, gli sviluppatori non hanno modo di sapere che questo è il problema esatto, quindi possiamo suggerire ciecamente all'utente di controllare la sincronizzazione dell'orologio di sistema, sperando che siano uno dei pochi i cui orologi non sono sincronizzati.
    5. SERVICE_NOT_AVAILABLE può verificarsi quando un utente radicato ha eliminato l'app Hangouts / GTalk dal proprio dispositivo (perché considerava bloatware). GCM è implementato e gestito da Hangouts / GTalk, quindi non è ansible utilizzare GCM senza di esso.
    6. SERVICE_NOT_AVAILABLE può verificarsi se l'utente esegue un dispositivo che non dispone di API Google installate (ad esempio il Kindle di Amazon). Niente da fare qui, questi utenti non riceveranno mai notifiche di spinta dalla tua app.

    Per saperne di più: http://eladnava.com/google-cloud-messaging-extremely-unreliable/

    Questi problemi da soli sono stati sufficienti per farmi iniziare a cercare alternative GCM. Vorrei get una recensione di 1-star sulla mia applicazione each giorno o due, con un commento contenente il messaggio di errore visualizzato quando un SERVICE_NOT_AVAILABLE è stato lanciato. Non c'era niente che potessi fare per aiutare questi utenti, perché la maggior parte di loro lo riceveva per motivi fuori dal loro controllo.

    Un'alternativa a Google Cloud Messaging

    Pushy ( https://pushy.me/ ) è un gateway indipendente di notifica push, completamente indipendente da GCM. Mantiene la propria connessione di socket di background, proprio come GCM, per ricevere notifiche push. Il protocollo sottostante è MQTT, un protocollo pub / sub estremamente leggero, che utilizza pochissima width di banda di networking e batteria.

    Un enorme vantaggio di Pushy è che il codice per l'invio di una notifica push (dal server) e la logging del dispositivo per le notifiche push sono in realtà intercambiabili tra GCM e Pushy. Ciò rende super facile passare a Pushy dopo l'implementazione di GCM e whererlo scavare per la sua instabilità.

    (Dichiarazione completa: ho fondato Pushy per i miei progetti e ho realizzato che molte applicazioni avrebbero beneficiato di un tale servizio)

    Per me – il tempo dell'apparecchio non era corretto. Ho cambiato le impostazioni del dispositivo per utilizzare "Data e ora automatica", riprovato e tutto buono.

    Saluti

    Ho avuto lo stesso problema ma nessuna delle soluzioni di cui sopra ha risolto il problema nel mio caso. Fortunatamente ho risolto di recente e voglio spiegare come, saltarlo, aiuterai altri:

    Nel mio caso, stavo registrando il servizio push in una class di applicazione personalizzata (che viene eseguita prima di qualsiasi attività e penso sia dovuta a questo che alcune cose non siano state inizializzate propriamente). Cambiarlo all'attività principale risolve il problema.

     public class MyCustomApp extends Application { @Override public void onCreate() { super.onCreate(); PushService.register(this); //BAD IDEA, don't register pushes in Application Class } } 

    Ho avuto un problema simile. Ha funzionato bene su un google nexus (Android 4.4.2), ma non su una galassia Samsung s3 (Android 4.1.2). Stavo ricevendo SERVICE_NOT_AVAILABLE alla logging sul Samsung. Si è scoperto il tempo in cui Samsung era spento. Non è stato impostato per l'aggiornamento automatico con Network Time. Una volta che ho fissato che GCM ha funzionato come un fascino. Grazie – Umesh

    Nel mio caso, la soluzione era quella di aggiungere una nuova azione di filter intentuale, REGISTRAZIONE, al manifesto, per https://snowdog.co/blog/dealing-with-service_not_available-google-cloud-messaging/

      <receiver android:name=".RemoteNotificationReceiver" android:permission="com.getset.getset.c2dm.permission.SEND" > <intent-filter> <action android:name="com.getset.getset.c2dm.intent.RECEIVE" /> <action android:name="com.getset.getset.c2dm.intent.REGISTRATION" /> <category android:name="com.getset.getset" /> </intent-filter> </receiver> 

    Devo ammettere che sono sorpreso che questo funziona, visto che manca dal tutorial, ma eliminarla definitivamente trasforma un id di logging di successo in un'exception.

    Nota: utilizzare l'emulatore Nexus 5 API 21 (Lollipop).

    Per me c'era un problema di connessione. Cambiare connessione internet risolve il mio problema

    Per me, avevo girato "Background Data Access" per i servizi di google facendo clic su "Limita i dati di background" nell'opzione Utilizzo dei dati sulla mia Galaxy S4. Appena ho triggersto il problema risolto sulla networking cantina. Su Wifi funzionava bene.

    Per me, il problema era che il telefono non era collegato a Internet. Scollego e collegato a Wi-Fi e provato connettività con Browser e provato di nuovo. Ha lavorato come un fascino ๐Ÿ™‚

    Mi sono voltato di "Background Data Access" per i servizi di google. Deselezionando "Limitare i dati di background" nell'opzione Utilizzo dei dati Funziona per me!

    Per me goolge bloccato il mio IP !! Ho dovuto resettare il mio conn DSL per get un nuovo IP dalla piscina e tutto ha funzionato di nuovo, idk perché mi hanno bloccato, forse per aver provato molte applicazioni? In each modo sta lavorando adesso, spero che questo aiuti qualcun altro ๐Ÿ™‚

    Per me, il problema SERVICE_NOT_AVAILABLE era nel mio progetto di applicazione a causa della class ricevente. Così ho risolto dopo aver implementato il ricevitore come il seguente. <receiver android:name="receiver name" 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="your package"/> </intent-filter> </receiver> ti aiuterò ๐Ÿ™‚ .

    Dopo una lunga lotta sono riuscito a risolvere questo problema. Assicurati che l'applicazione Google Play Services sia aggiornata e che la sincronizzazione di background non sia distriggersta sul tuo telefono.

    L'Android รจ un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e cosรฌ via.