Autore Topic: Aiuto su push notifications  (Letto 742 volte)

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Aiuto su push notifications
« il: 19 Maggio 2013, 12:57:15 CEST »
0
ciao a tutti!
vorrei aggiunegere le notifiche push alla mia app.
ho seguito diversi tutorial ed ho già fatto questi passi:
-creare una applicazione in google apis
-creati i file lato server (php) per l'invio delle notifiche
-aggiunto al manifest i vari permessi e il receiver

mi manca l'ultimo passo, quello per prendere e visualizzare le notifiche.
considerate che a me serve a senso unico, cioè solo dal server alla app.
in pratica, quando viene eseguita un'operazione sul sito web deve essere inviata una notifica.
non mi serve invece il contrario (dalla app al server).

da quello che ho capito mi serve una classe che estenda GCMBaseIntentService.
ma sinceramente non ho ben capito come strutturarla e cosa altro mi serva.
potete darmi una dritta per favore??

Offline nicopasso

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
  • Sistema operativo:
    Windows 7, Mac OS X 10.5
Re:Aiuto su push notifications
« Risposta #1 il: 21 Maggio 2013, 12:10:22 CEST »
+1
Come giustamente hai detto il passo successivo è creare una sottoclasse di GCMBaseIntentService.

Una volta aggiunta la nuova classe al tuo package avrai una situazione di questo tipo:
Codice (Java): [Seleziona]
public class GCMIntentService extends GCMBaseIntentService {

        @Override
        protected void onError(Context arg0, String arg1) {
                // TODO Auto-generated method stub

        }

        @Override
        protected void onMessage(Context arg0, Intent arg1) {
                Log.i(TAG, "Received message");
               
                //Log del messaggio ricevuto dal server
                Log.d("MESSAGE", arg1.getExtras().toString());
   
                //Creazione del NotificationManager per la gestione delle push in arrivo dal server
                NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
       
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
               
                //Titolo e testo della notifica
                notificationBuilder.setContentTitle("Titolo");
                notificationBuilder.setContentText("Testo");
               
                //Il ticker è il testo che compare nella barra di stato del device alla comparsa della notifica
                notificationBuilder.setTicker("ticker");
               
                //Data e ora notifica
                notificationBuilder.setWhen(System.currentTimeMillis());
               
                //Icona (quella dell'app in questo caso)
                notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
               
                //Creo il pending Intent che viene lanciato quando la notifica viene premuta
                Intent notificationIntent = new Intent(this, MainActivity.class);
               
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                notificationBuilder.setContentIntent(contentIntent);
               
                //Imposto suono, luci e vibrazione notifica
                notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
                //auto-cancel viene utilizzato per far scomparire la notifica una volta premuta
                notificationBuilder.setAutoCancel(true);
               
                mNotificationManager.notify(1, notificationBuilder.build());
        }

        @Override
        protected void onRegistered(Context arg0, String arg1) {
                // TODO Auto-generated method stub
               
                //Qui ricevo il'ID di registrazione  
                Log.d("REG ID", arg1);
        }

        @Override
        protected void onUnregistered(Context arg0, String arg1) {
                // TODO Auto-generated method stub

        }

Una volta creata questa classe nella tua MainActivity devi inserire il codice che ri permette di registrare il device e ottenere il registrationId
Codice (Java): [Seleziona]
import com.google.android.gcm.CGMRegistrar;

...
...
         //Nel metodo onCreate
         GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
             GCMRegistrar.register(this, SENDER_ID);
             Log.v("PUSH", "Prima registrazione push");
        } else {
             Log.v("PUSH", "Già registrato");
        }

Direi che è tutto. Se hai importato il gcm.jar correttamente e impostato il manifest correttamente dovresti essere in grado di ricevere le notifiche.
« Ultima modifica: 21 Maggio 2013, 16:30:04 CEST da nicopasso »

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Aiuto su push notifications
« Risposta #2 il: 21 Maggio 2013, 23:09:35 CEST »
0
ciao!
intanto grazie per la risposta.
allora, ho creato la classe seguendo le tue istruzioni e aggiunto quelle righe nel onCreate dell'activity.
nel manifesta ho messo questo:
Codice: [Seleziona]
    <permission
        android:name="com.mp.banca.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.mp.banca.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
...................
        <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.mp.banca" />
            </intent-filter>
        </receiver>
        <service android:name=".GCMIntentService" />
in teoria quando avvio la app mi dovrebbe uscire uno dei messaggi che messo in Log giusto??
ma a me pare non esca nulla.
ad esempio:
Codice: [Seleziona]
                GCMRegistrar.checkDevice(this);
                GCMRegistrar.checkManifest(this);
                final String regId = GCMRegistrar.getRegistrationId(this);
                if (regId.equals("")) {
                        GCMRegistrar.register(this, SENDER_ID);
                        System.out.println("REGISTRATION OK");
                } else {
                        System.out.println("NO REGISTER");
                }
non mi vengono stampate nessuna delle du scritte nel log.

Offline nicopasso

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
  • Sistema operativo:
    Windows 7, Mac OS X 10.5
Re:Aiuto su push notifications
« Risposta #3 il: 22 Maggio 2013, 11:50:25 CEST »
0
Il manifest è corretto.
L'unica cosa che mi viene in mente è il valore SENDER_ID che devi andare a prendere dalla console Google.

Al di fuori del metodo onCreate nella MainActivity devi inserire
Codice (Java): [Seleziona]
private static final String SENDER_ID = "TUO_SENDER_ID";
Altro direi che non c'è.

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Aiuto su push notifications
« Risposta #4 il: 22 Maggio 2013, 21:04:01 CEST »
0
uhm mi sa che c'è proprio qualcosa che non va:
Codice: [Seleziona]
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                overridePendingTransition(R.anim.pull_in_left, R.anim.zero);
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_banca);
               
                final ActionBar actionBar = getActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
                actionBar.setTitle("");
                actionBar.addTab(actionBar.newTab().setText(R.string.tab_last_entries).setTabListener(new MyTabListener<FragmentEntries>(this, "entries", FragmentEntries.class)));
                actionBar.addTab(actionBar.newTab().setText(R.string.tab_last_releases).setTabListener(new MyTabListener<FragmentReleases>(this, "releases", FragmentReleases.class)));
                actionBar.addTab(actionBar.newTab().setText(R.string.tab_all_causal).setTabListener(new MyTabListener<FragmentCausal>(this, "causal", FragmentCausal.class)));
                actionBar.addTab(actionBar.newTab().setText(R.string.tab_all_accounts).setTabListener(new MyTabListener<FragmentAccounts>(this, "accounts", FragmentAccounts.class)));
                actionBar.addTab(actionBar.newTab().setText(R.string.tab_all_gps).setTabListener(new MyTabListener<FragmentGps>(this, "gps", FragmentGps.class)));
               
                JsonFile.createDir(path);
               
                System.out.println("MP_STARTED");
                GCMRegistrar.checkDevice(this);
                GCMRegistrar.checkManifest(this);
                final String regId = GCMRegistrar.getRegistrationId(this);
                if (regId.equals("")) {
                        GCMRegistrar.register(this, SENDER_ID);
                        System.out.println("REGISTRATION OK");
                } else {
                        System.out.println("NO REGISTER");
                }
        }
non esce neanche la scritta MP_STARTED.
ho anche provato con Log.v ma nulla.
però funziona tutto.
possibile???

Offline nicopasso

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
  • Sistema operativo:
    Windows 7, Mac OS X 10.5
Re:Aiuto su push notifications
« Risposta #5 il: 22 Maggio 2013, 21:18:32 CEST »
0
Oddio da questo pezzo di codice è un po' difficile capire cosa va e cosa non va.
Innanzitutto overridePendingTransition come mai è nel metodo onCreate? Che io sappia (magari mi sbaglio eh!) va o prima di startActivity(Intent) oppure dopo finish(), ma non l'avevo mai visto in questa posizione prima di super.onCreate().

Di altro sinceramente non saprei che dirti.
Prova a mettere il controllo per le push prima di tutto e vedere se recuperi il valore.