Android lezione 10 – Spedire SMS e introduzione al file manifest

Bene visto che abbiamo imparato durante tutte queste lezioni a lavorare co alcuni degli elementi dell’interfaccia grafica di android, questa volta inizieremo anche ad interagire con alcuni servizi del telefono. Quello che andremo a vedere é forse una delle caratteristiche piú usate nei telefonini di tutto il mondo: gli SMS!! Vi spiegheró come realizzare una semplice applicazione per inviare e ricevere gli SMS. Nel fare questo vedremo anche dei concetti nuovi, come per esempio gli inten-filter e le relative action, andremo a mettere mano direttamente al File AndroidManifest. Vedremo cosa sono le permission, etc. Quindi non ci resta che iniziare 🙂

Parte 1 – configurazione del servizio Una delle caratteristiche di android, é che ogni volta che installiamo una applicazione, sappiamo sempre quello che avrá il permesso o meno di fare. Avete presente la schermata di installazione ? Bene se non ci avete mai fatto caso, in quella schermata vengono riepilogate tutti servizi/componenti del telefonino utilizzate dall’app. Un esempio é la screenshot seguente:

Questa screenshot é stata presa dall’app Cronjob & Chmod Calculator (giusto per fare un pó di pubblicitá alle mie applicazioni 🙂 ) E come vedete nella parte in basso, trovate la sezione autorizzazioni, qua verranno elencate le autorizzazioni che l’applicazione richiede per funzionare. In questo caso come vedete l’autorizzazione richiesta é la “Comunicazione di Rete”, necessaria per visualizzare i banner. Diciamo che in questa maniera é un pó come chiedere il permesso all’utente di usare quelle componenti del telefonino. Quindi come per l’accesso a internet, se vogliamo accedere ai servizi relativi agli sms dobbiamo “chiedere il permesso” all’utente/android. Per fare questo dobbiamo modificare il Manifest della nostra applicazione (ovvero il file AndroidManifest.xml) e richiederlo mediante le linee:

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

Da inserire al di fuori dei tag <application>. Per questa prima parte ci basta inserire solo la prima delle due (SEND_SMS). Prima di andare avanti una breve spiegazione di cosa é il file AndroidManifest. Si tratta di un file XML presente nella root folder di ogni progetto che essenzialmente presenta delle informazioni essenziali sull’applicazione, quali:

  • Informazioni anagrafiche quali: nome app, versione, package etc.
  • Informazioni di sistema, quali tipo sdk minimo da utilizzare, impostazione dello schermo predefinita, target di installazione preferito etc.
  • Informazioni per lanciare l’app, per esempio: quale é la classe da lanciare quando l’applicazione viene avviata, quali icone utilizzare, a quali azioni associare l’applicazione (per le azioni probabilmente dedicheremo una lezione a parte)
  • I permessi dell’applicazione

Questo file é essenziale per poter  lanciare l’app android perché come vedete dice al sistema proprio come deve essere avviato il programma. Per ora, visto che dobbiamo solo spedire gli SMS non dobbiamo fare altro nel Manifest. E possiamo iniziare a scrivere la nostra applicazione. Prima di tutto per poter spedire un sms dobbiamo dotarci almeno di un interfaccia grafica minimale, composta da due EditText e un pulsante almeno. Essendo stati gia trattati come argomenti non mi dilungheró molto nella spiegazione, vi mostreró solo il codice (mi aspetto che se siete arrivati alla decima lezione siete anche in grado di leggerlo :D)

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
 
<EditText
android:id="@+id/numberinput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="57dp"
android:ems="10"
android:inputType="phone" >
 
<requestFocus />
</EditText>
 
<EditText
android:id="@+id/textinput"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_alignLeft="@+id/numberinput"
android:layout_below="@+id/numberinput"
android:layout_marginTop="44dp"
android:ems="10"
android:inputType="textMultiLine" />
 
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="138dp"
android:text="Send" />
 
</RelativeLayout>

Una volta posizionati i tre oggetti  associamo un OnClickListener al bottone, che utilizzeremo come pulsante per l’invio.  Il “cuore” dell’applicazione si trova nel metodo onClick(View v), ora vediamo cosa dovrá fare. Ovviamente la prima cosa che dovrá è leggere il contenuto delle due textbox:

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

Dopo di che possiamo prepararci all’invio del messaggio, e per farlo dobbiamo ottenere una istanza della classe SmsManager, mediante una chiamata al metodo statico della classe stessa getDefault:

SmsManager manager = SmsManager.getDefault();

L’import da aggiungere per avere accesso a questa classe é:

import android.telephony.SmsManager;

attenzione che esiste anche un altra classe SmsManager nel package  android.telephony.gsm.SmsManager, ma questa non va utilizzata in quanto deprecata. A questo punto spedire l’sms é un gioco da ragazzi, basta invocare il metodo sendTextMessage della classe appena istanziata. La sintassi generica del metodo é:

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

Spieghiamone gli argomenti

    • destinationAddress indica il numero destinazione
    • scAddress invece indica il numero del centro servizi, se viene lasciato null usa quello impostato nel telefonino.
    • text invece indica il messagio da spedire
    • sentIntent invece é un oggetto di tipo PendingIntent, e se é diverso da null viene invocato, quando il messaggio viene spedito o fallisce. Se viene spedito con successo si avrá un risultato di tipo Activity.RESULT_OK altrimenti verranno ritornati altri codici di errore. Per maggiori informazioni sui possibili errori vi rimando alla documentazione android ()
    • deliveryIntent Se diverso da null, questa intent viene sollevata nel momento in cui l’sms viene consegnato al destinatario. La pdu dello stato si trova negli extra.
Nel nostro caso ci limitiamo alla semplice spedizione di un messaggio, senza aggiungere nessuna Intent. E dato che non vogliamo usare un centro servizi diverso da quello usato dal telefonino, avremo:
     manager.sendTextMessage(phoneNumber, null, messageText, null, null);

Con questo abbiamo fatto la nostra applicazione.

Prima di chiudere qualcuno si potrá domandare: ok, ma se io volessi provare a spedire sms come faccio dall’emulatore? Niente di piú semplice. Avete visto che quando lanciate l’emmulatore Android, questo ha nella barra del titolo un numero di porta (normalmente 5554), bene quello é il numero di “telefono” del device, ora avviate un secondo emulatore (dovrebbe avere il numero 5556), e  provate a spedire un sms dal primo al secondo, usando quindi come numero di telefono 5556, e come per magia il gioco é fatto. Ecco una screenshot di come dovrebbe comparire l’applicazione:

 Nella prossima lezione vedremo invece come ricevere gli SMS, e piú avanti (forse la prossima, o piú in lá torneremo su questo esempio e vedremo come estenderlo anche per utilizzare le PendingIntent) .

Prima di chiudere come al solito vi dico dove trovare i sorgenti. Stavolta invece che su svn li metto su github (visto che mi ci sto divertendo con questo strumento :D) l’indirizzo é: https://github.com/inuyasha82/ItalialinuxExample (Il progetto si chiama SMSExample e si trova nella cartella LezioniAndroid).

E vi ricordo che ho recentemente aperto una pagina facebook per italialinux, se volete potete unirvi alla pagina a quest’indirizzo: http://www.facebook.com/pages/Italialinux/135660699914890?fref=ts

Con questo é tutto alla prossima lezione!!!

6 thoughts on “Android lezione 10 – Spedire SMS e introduzione al file manifest”

  1. ciao, complimenti per le guide che stai pubblicando… davvero fatte bene ed interessanti! sarei interessato a capire come implementare una semplice chat… magari sarebbe un buon argomento per una tua lezione… cmq ancora complimenti! ciao, continuerò a seguirti! 🙂

  2. Ciao
    Grazie mille per I complimenti (fanno sempre piacere ) e sono contento che le mie guide ti tornano utili.
    Comunque per la chat, che tipo di chat pensavi? Simile a whatsapp o tipo quelle basate su stanze come le vecchie irc. O basate su SMS?
    Forse comunque prima o poi potrei fare una guida su qualcosa di simile sfruttando il protocollo di notifiche push di google sfruttando il Google Cloud Messaging, anche se questo probabilmente non lo faro’ nell’immediato, la prossima lezione probabilmente sara’ sulla ricezione dei messaggi, e quell dopo pensavo di spendere qualche parola in piu’ sul manifest. Nel frattempo volevo far uscire la quarta lezione dell’in-app billing per android. Comunque sicuramente prima o poi questo argomento lo trattero’.

    1. si, in realtà pensavo proprio una chat tipo whatsapp… non necessariamente con tutte le funzionalità di whatsapp(invio immagini, video ecc) ma semplicemente una chat di invio/ricezione messaggi. Cmq anche le notifiche push sono un gran bell'argomento! Io sono un novizio in android (lo studio the un paio di mesi) e sto facendo un progetto x la tesi… e stavo appunto pensando di inserire nel mio progetto una piccola chat… però a dir la verità ancora non ci ho pensato "seriamente"… sono occupato a fare altre cose più importanti x la mia applicazione… cmq aspetto le tue prossime lezioni! ciao! 🙂 😉

    2. Allora credo che il miglior modo per creare una piccola chat con android sia appunto sfruttare un meccanismo simile alle notifiche push probabilmente il GCM sarebbe un ottimo strumento da sfruttare per la chat. Altrimenti penso che occorra passare per forza per un server centralizzato (almeno cosi su due piedi non mi viene in mente un modo per identificare un telefonino senza avere una qualche possibilita' di identificarlo a priori).

  3. si, in realtà pensavo proprio una chat tipo whatsapp… non necessariamente con tutte le funzionalità di whatsapp(invio immagini, video ecc) ma semplicemente una chat di invio/ricezione messaggi. Cmq anche le notifiche push sono un gran bell'argomento! Io sono un novizio in android (lo studio the un paio di mesi) e sto facendo un progetto x la tesi… e stavo appunto pensando di inserire nel mio progetto una piccola chat… però a dir la verità ancora non ci ho pensato "seriamente"… sono occupato a fare altre cose più importanti x la mia applicazione… cmq aspetto le tue prossime lezioni! ciao! 🙂 😉

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.