DevCorner: condividiamo e segnaliamo (gli errori)

DevCorner

Puntuali come un orologio svizzero, eccoci anche questa settimana pronti a partire con un altro dei nostri tip: questa volta è il turno dello sharing dei contenuti, precisamente messaggi di testo, con una piccola aggiunta, la validazione dei campi. Pronti a cominciare?

Iniziamo subito col dire che ci sono almeno due modi su Android per effettuare la condivisione: il vecchio metodo, che consiste nell'utilizzare le API antecedenti la versione 14, o il nuovo, che a questa impalcatura aggiunge un ActionProvider, che, se da un lato ci fornisce un'interfaccia leggermente più accattivante ed elaborata, dall'altra ci penalizza un po' nell'implementazione. Il primo passo da fare è la dichiarazione degli appositi bottoni nella nostra ActionBar tramite il codice XML di routine:




Come possiamo vedere, la parte interessante è alla quarta linea, dove vediamo la stringa relativa allo ShareActionProvider: grazie a questa dichiarazione, di fianco alla nostra icona della condivisione apparirà infatti l'ultimo programma che abbiamo usato per inviare il nostro testo, esattamente come succede con la galleria.

Per vedere il tutto funzionare a dovere, ci manca però ancora qualche passo, ad iniziare dalla dichiarazione ed inizializzazione dello SharedProvider, cui espliciteremo di utilizzare la history di sistema per tenere traccia dell'ultimo software utilizzato (in alternativa avremmo potuto utilizzare un file privato del nostro progetto, in modo tale da non andare a leggere da Android l'ultima app utilizzata per lo sharing ma tenerci uno storico personale) e al quale passeremo poi l'Intent per la condivione, come esemplificato nel codice qui sotto:

ShareActionProvider sap = (ShareActionProvider) shareMenuItem.getActionProvider();
sap.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
sap.setShareIntent(getShareIntent());

A questo punto, ci manca solamente la definizione dell'Intent per lo sharing, ma la procedura è comune sia al metodo vecchio, sia al metodo nuovo: allora qual'è la differenza? Sostanzialmente, quando viene creato questo Intent: se decidiamo di utilizzare il provider, verrà creato all'inizializzazione dello stesso fornitore, con i dati presenti al momento, mentre se andiamo ad utilizzare il metodo meno recente, avremo a disposizione tutti i dati che abbiamo inserito.

Vediamo quindi il metodo nel dettaglio:

final String extra_text = txtShareMessage.getEditableText().toString();
final String extra_subject = "SharedTest by AndroidWorld.it";

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, extra_subject);
if(extra_text.length() > 0) 
    shareIntent.putExtra(Intent.EXTRA_TEXT, extra_text);
else
    shareIntent.putExtra(Intent.EXTRA_TEXT, "ShareTest by AndroidWorld.it");

return shareIntent;

Come possiamo vedere, iniziamo a dire ad Android che vogliamo inviare qualcosa, specificando poi che questa cosa è puro testo, inseriamo quindi l'oggetto (è facoltativo) e il testo vero e proprio, tramite i due extra EXTRA_SUBJECT ed EXTRA_TEXT et voila, la magia è fatta. Semplice, no?

Avevamo accennato anche alla segnalazione: avete presente quei tooltip neri con l'iconcina rossa che appaiono quando inseriamo le credenziali del nostro account? Per crearli e cancellarli ci basta una singola riga di codice, ovvero, l'unica cosa necessaria è richiamare sul nostro EditText il metodo setError, a cui passiamo null per cancellare l'errore e la stringa che vogliamo venga visualizzata se decidiamo che il contenuto del componente non ci soddisfa appieno:

txtShareMessage.setError(getString(R.string.error_insert_message));

Come al solito, potrete trovare tutte le risorse nell'apposito thread del nostro forum.

Buona programmazione a tutti!