Autore Topic: GCM - Wakelock  (Letto 818 volte)

Offline salvatore.zagarella

  • Utente normale
  • ***
  • Post: 239
  • Respect: +2
    • Mostra profilo
    • Ieeng Solution
GCM - Wakelock
« il: 21 Febbraio 2013, 12:53:23 CET »
0
Salve ragazzi,
sto usando le notifiche android con GCM e il tutto sembra funzionare.
C'è un piccolo problema che ho risolto in parte. Per questioni di "pulizia di codice" ho posizionato tutti i file relativi al GCM_service in un package a parte. Ho modificato il manifest, che adesso posto, seguendo questo topic android - GCM with custom broadcastreceiver - Stack Overflow. Il problema sta nel fatto che non riesco a scatenare il broadcast receiver che mi consente, tra l'altro, di fare il wakelock del telefono.

Di seguito posto il codice essenziale.
Nel package dell'applicazione, ho il seguente Receiver per inoltrare le richiesta arrivate da GCM al mio customIntentService.
Codice (Java): [Seleziona]
package mio.package.demo;

import mio.gcm.GCMIntentService;
import android.content.Context;
import android.util.Log;

import com.google.android.gcm.GCMBroadcastReceiver;

public class Receiver extends GCMBroadcastReceiver {
        @Override
        protected String getGCMIntentServiceClassName(Context context) {
                Log.i("<<<<>>>>", "New Receiver");             
                return GCMIntentService.class.getName();
        }
}

Il file GCMIntentService nel package dedicato, implementa i metodi di ricezione, ecc, dei messaggi da GCM e questa parte funziona.

Nella parte relativa alla registrazione, negli esempi trovati, viene istanziato il broadcastReveicer per il wakelock del telefono. Questo file è inserito nel package dedicato al MIO GCM.
Di seguito il codice.
Codice (Java): [Seleziona]
public class RegisterGCM {
        static AlertDialogManager alert = new AlertDialogManager();
        static AsyncTask<Void, Void, Void> mRegisterTask;                // Asyntask

        public static void signIn(final Context context) {
                ConnectionDetector cd = new ConnectionDetector(context);        // Connection detector         
                if (!cd.isConnectingToInternet()) {                     // Internet Connection is not present                          
                        alert.showAlertDialog(context,
                                        "Internet Connection Error",
                                        "Please connect to working Internet connection", false);                                               
                }

                GCMRegistrar.checkDevice(context);              // Make sure the device has the proper dependencies.                     
                GCMRegistrar.checkManifest(context);    // Make sure the manifest was properly set             

                context.registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION));

                final String regId = GCMRegistrar.getRegistrationId(context);   // Get GCM registration id
                if (regId.equals("")) {
                        Log.e("register", "");
                        GCMRegistrar.register(context, SENDER_ID);                      // Registration is not present, register now with GCM
                }else {        
                        Log.e("register", "presente");
                        if (GCMRegistrar.isRegisteredOnServer(context)) {       // Device is already registered on GCM
                                Log.i("GCM >>>>>>>", "Device già registrato");
                        }else{
                                Log.e("register", "RIPROVO");

                                // Try to register again, but not in the UI thread.                            
                                mRegisterTask = new AsyncTask<Void, Void, Void>() {
                                        @Override
                                        protected Void doInBackground(Void... params) {                                        
                                                ServerUtilities.register(context, regId);
                                                return null;
                                        }

                                        @Override
                                        protected void onPostExecute(Void result) {
                                                mRegisterTask = null;
                                        }

                                };
                                mRegisterTask.execute(null, null, null);
                        }
                }
        }

        /**
         * Receiving push messages
         * */

       
        [b]public static final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {[/b]
                @Override
                public void onReceive(Context context, Intent intent) {
                        Log.d("BroadCast >>>>>>", intent.toString());

                        //String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
                        // Waking up mobile if it is sleeping
                        WakeLocker.acquire(context);


                        // Showing received message                    
                        Toast.makeText(context, "New Message", Toast.LENGTH_LONG).show();

                        // Releasing wake lock
                        WakeLocker.release();
                }
        };

        protected void onDestroy() {
                if (mRegisterTask != null) {
                        mRegisterTask.cancel(true);
                }
        }

La registrazione funziona perfettamente ma, all'arrivo del messaggio, non scatta il metodo
Codice: [Seleziona]
public static final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() infatti il cell resta col display spento, nel logcat non vedo il messaggio del mHandleMessageReceiver , anche se la notifica arriva correttamente.

Di seguito il logcat.
Codice: [Seleziona]
02-21 12:47:31.608: V/GCMBroadcastReceiver(20216): onReceive: com.google.android.c2dm.intent.RECEIVE
02-21 12:47:31.613: V/GCMRegistrar(20216): Setting the name of retry receiver class to mio.package.demo.Receiver
02-21 12:47:31.618: V/GCMBroadcastReceiver(20216): GCM IntentService class: mio.package.gcm.GCMIntentService
02-21 12:47:31.628: V/GCMBaseIntentService(20216): Acquiring wakelock
02-21 12:47:31.658: V/GCMBaseIntentService(20216): Intent service name: GCMIntentService-561148634608-1
02-21 12:47:31.673: I/(20216): Received message  ()
02-21 12:47:31.673: I/PUSH(20216): test
02-21 12:47:31.728: V/GCMBaseIntentService(20216): Releasing wakelock

Come si può vedere nel logcat, il messaggio arriva correttamente ma non riesco a gestire il broadcast correttamente.
Sapete dove posso intervenire per risolvere la questione?

Grazie..

Post unito: 21 Febbraio 2013, 14:41:41 CET
Ok ragazzi ho risolto..
Non lanciavo il broadcast..
Tutto risolto grazie..
« Ultima modifica: 21 Febbraio 2013, 14:41:41 CET da salvatore.zagarella, Reason: Merged DoublePost »

Offline drucks87

  • Utente junior
  • **
  • Post: 50
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Huawei ideos
  • Play Store ID:
    drucks team
  • Sistema operativo:
    Windows 7
Re:GCM - Wakelock
« Risposta #1 il: 03 Maggio 2013, 11:56:37 CEST »
0
ciao,
mi capita che provando l'app sul cellulare ricevo sempre null quando richiedo l'id

Codice (Java): [Seleziona]
GCMRegistrar.getRegistrationId(this);
come posso risolvere?

grazie
ciao