Intent Impliciti per comunicare con altre app o servizi
Il meccanismo degli Intent Impliciti è uno dei cardini del sistema operativo Android, che ti permetterà di comunicare, non solo con altre Activity interne alla tua applicazione, ma soprattutto con altre applicazioni o servizi. In questo tutorial vedremo a cosa servono e come possano essere usate per operazioni comuni.
Immagina di voler richiamare dalla tua applicazione, tramite il classico pulsante "condividi", l'applicazione Facebook oppure Twitter, oppure di voler inviare un sms automatico tramite il tocco di un pulsante presente sempre nella tua applicazione, oppure d'inserire un bottone che al tocco faccia partire la chiamata al numero telefonico della tua amante (te lo sconsiglio!).
Ebbene, queste operazioni sono possibili grazie ad un meccanismo che prende il nome di Intent Implicito.
In uno dei tuorial precedenti abbiamo visto come Intent sia un meccanisco attraverso il quale sia possibile non solo chiamare e inviare dati a nuove Activity, ma anche comunicare con altre applicazioni presenti nel tuo dispositivo, come per esempio il browser, il client di posta elettronica, il dialer per comporre i numeri telefonici etc.
Abbiamo parlato della distinzione esistente tra Intent Espliciti e Intent Impliciti.
Vediamo allora questo secondo caso in dettaglio, e cerchiamo di capire come si possano applicare questi concetti a casi reali di uso comune nelle applicazioni.
Cosa Imparerai
- Capirai a cosa servono e la sintassi per chiamare un Intent Implicito
- Imparerai ad aprire una finestra del browser tramite un pulsante nella tua app
- Imparerai ad aprire il tastierino telefonico con un numero precompilato da chiamare
- Imparerai a precompilare un’email in automatico per inviarla con un tocco
Intent Impliciti: a cosa servono?
La grossa differenza rispetto al meccanismo degli Intent Espliciti, è che negli Intent Impliciti, non sappiamo a priori quale sarà l'applicazione o il componente con cui la mia Activity andrà a comunicare. Quindi conosciamo l'eventuale dato da passare, e l'azione ma non sappiamo a chi esattamente. Sembra una situazione assurda, ma nella realtà, il 90% dello scambio di informazioni tra le Activity di una applicazione, avviene in modo "implicito".
Basti pensare ad esempio a quando si vuole condividere qualcosa letto in una pagina internet. Tutti i browser, danno la possibilità di selezionare un menu dal quale scegliere il famoso pulsante "condividi".
Intent Impliciti per chiamare un'Activity e/o applicazione
Vediamo allora prima di tutto come chiamare in modo Implicito un'applicazione, specificando quale sia il tipo di azione da trasmettere, quindi che la Sub Activity dovrà monitorare e la tipologia di dati da passare.
Ci vuole poca fantasia per capire che si userà ancora una volta la classe Intent, ma con un costruttore diverso rispetto agli Intent Impliciti.
Intent intenzione = new Intent(AZIONE, DATI);
In questo caso, il costruttore richiede due parametri: AZIONE e DATI.
NB: Come puoi immaginare, di costruttori associati a Intent, ne esistono molti, ma come sempre, noi vedremo quelli di uso comune.
- AZIONE è una stringa, già codificata per noi dagli sviluppatori di Android, interna alla classe Intent, che definisce il tipo di azione che intendo eseguire.
- DATI è un parametro FACOLTATIVO, a cui bisogna prestare un po’ di attenzione perché non è possibile inserirlo con la notazione classica a cui siamo abituati, ad esempio all'interno delle doppie virgolette. E' necessario inserirli con una notazione del tipo A:B e manipolarli con il metodo parse() della classe URI. Anche in questo caso, non devi prendere paura perché, scritto cinque/sei volte, ti diventerà familiare come notazione.
Le costanti della classe Intent che rappresentano le azioni più comuni, le puoi trovare qui sotto:
- Intent.ACTION_VIEW: per visualizzare dati interni o esterni al dispositivo
- Intent.ACTION_CALL: per comporre un numero telefonico
- Intent.ACTION_DIAL: per chiamare un numero
- Intent.ACTION_EDIT: per modificare dati
Per quanto riguarda le tipologie di dati che è possibile trasmettere, le più comuni sono quelle per aprire una pagina web, chiamare un numero telefonico, aprire la mappa, aprire la rubrica, come qui sotto riportato:
- Uri.parse("http://www.corsoandroid.it")
- Uri.parse("tel:(+339) 049900000")
- Uri.parse("geo: 0,0?q=query")
- Uri.parse("content://contacts/people/")
Come usare la classe Intent() per operazioni comuni
Facciamo subito alcuni esempi pratici, che ci faranno capire senza fatica la sintassi da usare.
Esempio 1: aprire finestra del browser con Intent
Immagina di voler recuperare una pagina da internet per mostrarla al tuo navigatore, direttamente all’interno della tua app. Ipotizzando di avere un bottone a cui ho aggiunto una sentinella, come abbiamo imparato a fare nel tutorial Gestire il tocco su di un bottone, se all’interno di questa inserisco il codice seguente:
Intent intenzione = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.video-corsi.com")); startActivity(intenzione);
in automatico, verrà lanciato il browser predefinito nel dispositivo, o un insieme di possibile app in grado di gestire questa azione, quindi potenzialmente anche un’app diversa dal classico browser predefinito (vedremo più avanti come far sì che la tua app risponda a simili chiamate).
In questo caso abbiamo dovuto specificare due parametri:
- l’AZIONE, ossia la costante predefinita ACTION_VIEW a cui deve saper rispondere l’eventuale applicazione presente nel mio dispositivo
- e la TIPOLOGIA di dati che dovrà gestire l’applicazione che si prenderà cura di rispondere a questa chiamata.
Esempio 2: aprire il tastierino chiamate con Intent
Se volessi creare un’applicazione che mostri la pulsantiera per le chiamate, ogni volta che tocchiamo un particolare bottone del mio layout, potrei scrivere:
Intent intenzione = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:029939939")); startActivity(intenzione);
In questo caso abbiamo sempre specificato due parametri azione e dati:
- l’azione già codificata è ACTION_DIAL
- e il tipo di dati passato al metodo parse della classe URI, è nella forma A:B, dove B è proprio il numero che vogliamo chiamare, mentre A potrebbe essere http: oppure mailto: oppure tel: etc.
In entrambi i casi visti fino ad ora, ho codificato direttamente nel codice Java, il valore, nel primo caso un indirizzo url (http://www.corsoandroid.it), nel secondo un numero (029939939), ma nella pratica, questi dati potrebbero essere recuperati da una sorgente esterna (vedi DB) o internamente a qualche file XML o txt
Il metodo Intent() può anche essere richiamato, senza argomenti, andando ad usare invece tutta una serie di altri metodi, che permettono di impostare separatamente ognuno dei dati visti.
Esempio 3: compilare un’email in automatico con Intent
Se volessi creare un’applicazione, che ti dia la possibilità di inviare delle email precompilate, ad esempio per automatizzare il processo di gestione di alcune operazioni interna alla tua azienda (es. email di sollecito, email di ringraziamento, auguri etc) potresti creare un database locale alla tua app, in cui memorizzare campi quali l’oggetto e il corpo del messaggio.
In questo modo potresti poi richiamare ognuno di questi messaggi e precompilare un’email senza doverli riscrivere ogni volta. Con rapidità, al tocco dell’ipotetico bottone invia, potrei aprire il client di posta elettronica integrato, ed inserire solo l’indirizzo email a cui inviare il messaggio, il tutto con un solo click.
Qui sotto puoi vedere un esempio di codice, come accennato in precedenza, che fa uso del costruttore Intent senza passaggio di parametri, i quali invece vengono aggiunti, con metodi specifici della classe, come setAction e putExtra. E' chiaro che per poter funzionare correttamente, è necessario che nel tuo dispositivo o emulatore, sia presente e configurata con un account email, un'applicazione per gestire le email.
public class Pagina1 extends AppCompactActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // identifico il bottone premuto Button btn1 = (Button) findViewById(R.id.button1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // azioni da fare Intent intenzione = new Intent(); intenzione.setAction(Intent.ACTION_SEND); intenzione.putExtra(Intent.EXTRA_EMAIL, "email a cui inviare"); intenzione.putExtra(Intent.EXTRA_SUBJECT, "Oggetto Email"); intenzione.putExtra(Intent.EXTRA_TEXT, "testo da mostrare"); intenzione.setType("text/plain"); startActivity(intenzione); } }); } }
Le due tipologie di parametri impostati, come vedi, sono:
- l’AZIONE, rappresentata dalla costante della classe Intent, ACTION_SEND
- e l’insieme dei dati, quindi non solo uno, iniettati tramite il metodo putExtra e suddivisi tra EXTRA_TEXT, EXTRA_EMAIL, EXTRA_SUBJECT, compresa la tipologia di questi ossia text/plain.
A questo punto, visto che hai imparato ad usare Intent per inviare a qualche applicazione i tuoi dati, può sorgerti una domanda: ma come faccio a creare una mia applicazione in grado di “svegliarsi”, al verificarsi di qualche azione specifica, trasmessa tramite un Intent implicito?
E’ necessario chiudere il cerchio con un meccanismo, molto simile a quello che avviene in natura tra madre e il pianto del bambino appena nato (o come dovrebbe accadere)
Cose che vedremo a partire dal prossimo tutorial su "Intent Filter per rispondere ad un'intent Implicito"
2024-11-14 Tipo/Autore: Davide Copelli {ing} Pubblicato da: CorsoAndroid.it