Introduzione alla programmazione android - Android@tulug lezione 3

25
Android @Tulug Lezione 3 By IvanGualandri Twitter: @Italialinux

description

Terza lezione del corso android tenuto presso il TuLug (Tuscia Lug) A Viterbo. Le slides sono completamente in italiano (Slides are in italian! Sorry!)

Transcript of Introduzione alla programmazione android - Android@tulug lezione 3

Page 1: Introduzione alla programmazione android - Android@tulug lezione 3

Android @TulugLezione 3By IvanGualandri

Twitter: @Italialinux

Page 3: Introduzione alla programmazione android - Android@tulug lezione 3

Riassunto puntate precedenti

● Abbiamo visto come gestire i click di un bottone, facendo implementare alla nostra activity l'interfaccia OnClickListener, e implementando il metodo onClick(View v), associandolo al bottone mediante il metodo setOnClickListener(this)

Page 4: Introduzione alla programmazione android - Android@tulug lezione 3

Riassunto puntate precedenti/2

● Abbiamo visto creare un elemento via codice e aggiungerlo alla gui. I passi sono:○ Creare l'oggetto che vogliamo

aggiungere○ Ottenere un istanza del layout con

findViewById○ Aggiungerlo nel layout con il

metodo addView

Page 5: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere e inviare sms

Page 6: Introduzione alla programmazione android - Android@tulug lezione 3

Layout dell'applicazione

Prima di tutto disegnamo un layout adeguato per spedire sms. Dovreste gia saperlo fare :)

Partiremo dall'invio sms che dei due è il più semplice

Page 7: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - Intro

Android fornisce la maggior parte delle funzionalitá del telefono mediante dei Manager.

Alcuni esmpi: ● SMSManager - Gestione SMS● AudioManager - Gestione Audio● BluetoothManager - Gestione Bluetooth.● etc. etc.

Page 8: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - Intro/2

Ovviamente per l'accesso a queste funzionalitá ci servono gli adeguati permessi. Da inserire nel Manifest dell'applicazione. Nel nostro caso serviranno: ● SEND_SMS● RECEIVE_SMS

<uses-permission android:name="android.permission.SEND_SMS" /><uses-permission android:name="android.permission.RECEIVE_SMS" />

Page 9: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - Intro/3

Vediamo il workflow della nostra applicazione(anche se abbastanza intuitivo):1. L'utente inserisce il messaggio2. L'utente inserisce il numero di telefono3. Preme il pulstante Invia per spedire l'sms.

L'invio verrà effettutato quindi sará gestito dall'evento onClick del bottone. Ma questo sapete farlo (se avete seguito la lazione 2)...

Page 10: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - Intro/3

Quindi l'evento onClick deve leggere il testo contenuto nelle due caselle di testo (messaggio e numero) e inviarlo attraverso l'SmsManager.Leggiamo il testo inserito nelle due EditText:

EditText numberinput = (EditText) findViewById(R.id.number) ;EditText messageinput = (EditText) findViewById(R.id.message) ; String phoneNumber = numberinput.getText();String messageText = messageInput.getText();

Page 11: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - SMSManager

Come accennato l'SmsManager è una classe che ci permette di gestire gli aspetti dell'invio di un sms direttamente dal nostro programma.

Essendo un servizio offerto dal telefono, non dobbiamo crearne uno nuovo, ma ottenere quello esistente.

SmsManager manager = SmsManager.getDefault();

Page 12: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - SMSManager/2Per spedire il messaggio:

public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)

● destinationAddress è il numero di telefono del destinatario

● text è il messaggio.● scAddress è il numero del service center (se null si usa

quello di default)● sentIntent e deliveryIntent sono utili per tracciare la

spedizione del messaggio (invio in corso, spedito)

Page 13: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - SMSManager/3

Nel nostro caso vogliamo solo spedirlo, senza tracciamento.

Quindi avremo più o meno:

smsManager.sendTextMessage(sendTo, null, myMessage, null, null);

Page 14: Introduzione alla programmazione android - Android@tulug lezione 3

Spedire SMS - Come testarlo?

Possiamo usare l'emulatore.Il numero di telefono si trova nella barra del titolo (si tratta della porta del debugger). Quindi apriamo due emulatori su uno girerá la nostra app e l'altro riceverá i messaggi.

Page 15: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - IntroduzionePer ricevere un messaggio dobbiamo far sì che la nostra applicazione sia informata di quando arriva un SMS.

Questo lo facciamo introducendo un nuovo Oggetto: ● il BroadCastReceiver

Come la Activity anche questa è una classe astratta, quindi creeremo una classe che la estende.

Serve per ricevere dati dalle Intent che vengono generate.

Page 16: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Nel manifest

Un broadcast receiver, al pari di una activity va registrato nel manifest, non come activity ma come receiver:

<receiver android:name=".SMSReceiver" android:enabled="true"> <intent-filter>

<action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter></receiver>

Dove in android:name metteremo il nome della classe BroadCastReceiver.

Page 17: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Intent-filter

<intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter>

Questo pezzetto di codice informa il sistema che questo receiver vuole essere "svegliato" solo se si verifica l'action SMS_RECEIVED.

Le action come dice la parola stessa sono delle azioni che vengono sollevate dal sistema al verificarsi di alcuni eventi.

Page 18: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Creiamo la classeAndiamo nel package principale e creiamo la classe SMSReceiver.

public class SMSReceiver extends BroadcastReceiver {

@Overridepublic void onReceive(Context context, Intent intent) {

....}

}

L'oggetto BroadCastReceiver richiede, per poter essere chiamato al verificarsi delle action definite, l'implementazione del metodo onReceive:

Page 19: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Ma dove sta l'sms?@Overridepublic void onReceive(Context context, Intent intent) {

....}

A giudicare dalla firma di questo metodo non si vede alcun SMS al suo interno! :)

Invece non è così, si trova come extra nell'intent. Le Intent sono una definizione astratta dell'azione che si vuole eseguire (l'action appunto). Ricevere un sms genera una Intent RECEIVE_SMS che la nostra app intercetterà.

Page 20: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Prendere l'sms/2Per ottenere l'insieme degli extra di una Intent, possiamo usare il metodo getExtras, che ci torna un oggetto di tipo Bundle (un semplice contenitore di variabili).

Bundle bundle = intent.getExtras();

Ogni variabile salvata nel bundle è identificata da una chiave, e quella del messaggio è chiamata "pdus" quindi dal bundle prendiamo l'oggetto pdus:

Object[] pdus = (Object[])bundle.get("pdus");

Page 21: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Prendere l'sms/3Object[] pdus = (Object[])bundle.get("pdus");

Ma ancora non basta! Abbiamo un semplice Object generico, dobbiamo poterlo leggere in qualche modoL'object[] pdus contiene il o i messaggi ricevuti dal telefonino.

Per poterli leggere comodamente dobbiamo convertirli in un oggetto più specifico: SmsMessage.

Page 22: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Prendere l'sms/3Quindi creiamo una vettore di SmsMessage della stessa dimensione del vettore pdus: SmsMessage[] messages = new SmsMessage[pdus.length];

Convertiamo quindi ogni elemento di pdus in SmsMessage, utilizzando il metodo statico createFromPdu:

for(int i = 0; i < pdus.length; i++){messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

}

Page 23: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Leggere l'smsOra possiamo leggere tranquillamente il testo del messaggio, e in questo esempio mostrarlo su una notifica Toast: for(SmsMessage message: messages){

String messagestr = message.getMessageBody(); String sender = message.getOriginatingAddress(); Toast.makeText(context, sender + ": " + messagestr, Toast.

LENGTH_SHORT).show();}

Dove getMessageBody ritorna il testo del messaggio.Mentre getOriginatingAddress torna il mittente del messaggio.

Page 24: Introduzione alla programmazione android - Android@tulug lezione 3

Ricevere SMS - Risultato

Page 25: Introduzione alla programmazione android - Android@tulug lezione 3

Fine...

Grazie per l'attenzioneIvan