Android utilizza gli intent e le funzionalità aggiuntive associate per consentire agli utenti di condividere informazioni in modo rapido e semplice utilizzando le loro app preferite.
Android offre agli utenti due modi per condividere dati tra le app:
- Il foglio di condivisione di Android è progettato principalmente per inviare contenuti all'esterno della tua app e/o direttamente a un altro utente. Ad esempio, condividere un URL con un amico.
- Il resolver di intent di Android è più adatto per passare dati alla fase successiva di un'attività ben definita. Ad esempio, aprire un PDF dalla tua app e consentire agli utenti di scegliere il visualizzatore preferito.
Quando crei un intent, specifichi l'azione che vuoi che esegua.
Android utilizza l'azione ACTION_SEND
per inviare dati da un'attività all'altra,
anche oltre i confini dei processi. Devi specificare i dati
e il relativo tipo. Il sistema identifica automaticamente le attività compatibili
che possono ricevere i dati e le mostra all'utente. Nel caso dello strumento di risoluzione dell'intent,
se solo un'attività può gestire l'intent, viene avviata immediatamente.
Perché usare il foglio di condivisione di Android
Ti consigliamo vivamente di utilizzare Sharesheet per Android per garantire coerenza ai tuoi utenti tra tutte le app. Non visualizzare l'elenco di destinazioni di condivisione della tua app o creare varianti del foglio di condivisione.
Android Sharesheet consente agli utenti di condividere informazioni con la persona giusta, con suggerimenti di app pertinenti, il tutto con un solo tocco. Sharesheet può suggerire target non disponibili per le soluzioni personalizzate e utilizza un ranking coerente. Questo perché Sharesheet può prendere in considerazione le informazioni sull'attività delle app e degli utenti disponibili solo per il sistema.
Android Sharesheet offre anche molte funzioni utili per gli sviluppatori. Ad esempio, puoi procedere nel seguente modo:
- Vedere quando gli utenti completano una condivisione e dove
- Aggiungi
ChooserTarget
e target per app personalizzati - Fornire anteprime di contenuti RTF, a partire da Android 10 (livello API 29)
- Escludere i target che corrispondono a nomi di componenti specifici
Usa il foglio di condivisione di Android
Per tutti i tipi di condivisione, crea un intent e imposta la relativa azione su Intent.ACTION_SEND
.
Per visualizzare il foglio di condivisione Android, chiama Intent.createChooser()
,
passandogli l'oggetto Intent
.
Viene restituita una versione dell'intent che mostra sempre il foglio di condivisione di Android.
Invia contenuto testuale
L'utilizzo più semplice e comune di Android Sharesheet è inviare contenuti testuali da un'attività all'altra. Ad esempio, la maggior parte dei browser può condividere l'URL della pagina attualmente visualizzata come testo con un'altra app. Ciò è utile per condividere un articolo o un sito web con gli amici via email o sui social network. Ecco un esempio di come fare:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
Se vuoi, puoi aggiungere ulteriori informazioni per includere altre informazioni, ad esempio i destinatari dell'email
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
l'oggetto dell'email
(EXTRA_SUBJECT
) e così via.
Nota: alcune app email, come Gmail, prevedono String[]
per extra come EXTRA_EMAIL
e EXTRA_CC
. Utilizza
putExtra(String, String[])
per aggiungerli al tuo intento.
Invia contenuti binari
Condividi i dati binari utilizzando l'azione ACTION_SEND
.
Imposta il tipo MIME appropriato e inserisci un URI per i dati nella sezione EXTRA_STREAM
aggiuntiva, come mostrato nell'esempio seguente.
Questo viene comunemente utilizzato per condividere un'immagine, ma può essere utilizzato per condividere qualsiasi tipo di contenuto binario.
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
L'applicazione ricevente richiede l'autorizzazione per accedere ai dati a cui punta Uri
. A questo scopo, è consigliabile procedere in due modi:
- Archivia i dati nel tuo
ContentProvider
, assicurandoti che le altre app dispongano dell'autorizzazione corretta per accedere al tuo provider. Il meccanismo preferito per fornire l'accesso è utilizzare autorizzazioni per URI, che sono temporanee e concedono l'accesso solo all'applicazione ricevente. Un modo semplice per creare unContentProvider
come questo è utilizzare il corso helperFileProvider
. - Utilizza il sistema
MediaStore
. IlMediaStore
è principalmente per i tipi MIME video, audio e immagine. Tuttavia, a partire da Android 3.0 (livello API 11), può archiviare anche tipi non multimediali. Per ulteriori informazioni, consultaMediaStore.Files
. I file possono essere inseriti inMediaStore
utilizzandoscanFile()
, dopodiché unUri
in stilecontent://
adatto alla condivisione viene passato al callbackonScanCompleted()
fornito. Tieni presente che, una volta aggiunti al sistemaMediaStore
, i contenuti sono accessibili a qualsiasi app sul dispositivo.
Utilizza il tipo MIME corretto
Fornisci il tipo MIME più specifico disponibile per i dati che invii. Ad esempio, utilizza text/plain
per condividere testo normale. Di seguito sono riportati alcuni tipi MIME comuni per l'invio di dati semplici in Android:
Registrazione dei ricevitori per | I mittenti inviano |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Estensioni dei file supportate | application/pdf |
Per ulteriori informazioni sui tipi MIME, consulta il registro ufficiale dei tipi di media MIME IANA.
Il foglio di condivisione di Android potrebbe mostrare un'anteprima dei contenuti, a seconda del tipo MIME fornito. Alcune funzionalità in anteprima sono disponibili solo per tipi specifici.
Condividi più contenuti
Per condividere più contenuti, utilizza l'azione ACTION_SEND_MULTIPLE
insieme a un elenco di URI che rimandano ai contenuti. Il tipo MIME varia a seconda del
mix di contenuti che condividi. Ad esempio, se condividi tre immagini JPEG, utilizzi il tipo
"image/jpg"
. Per una combinazione di tipi di immagini, utilizza "image/*"
per associare un'attività che gestisce qualsiasi tipo di immagine. Sebbene sia possibile condividere un mix di tipi, sconsigliamo vivamente di farlo perché non è chiaro al destinatario quale debba essere inviato. Se è necessario inviare più tipi, utilizza
"*/*"
. Spetta all'applicazione ricevente analizzare
ed elaborare i dati. Ecco un esempio:
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
Assicurati che gli oggetti Uri
forniti puntino
ai dati a cui può accedere l'applicazione ricevente.
Aggiungere contenuti avanzati alle anteprime di testo
A partire da Android 10 (livello API 29), il foglio di condivisione Android mostra un'anteprima del testo condiviso. In alcuni casi, il testo condiviso può essere difficile da comprendere. Valuta la possibilità di condividere un
URL complicato come https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Un'anteprima più completa può rassicurare gli utenti sui contenuti condivisi.
Se stai visualizzando l'anteprima del testo, puoi impostare un titolo, un'immagine in miniatura o entrambi. Aggiungi una descrizione a
Intent.EXTRA_TITLE
prima di chiamare il numero Intent.createChooser()
e aggiungi una
miniatura pertinente usando ClipData
.
Nota: l'URI del contenuto dell'immagine viene fornito da un
FileProvider
, in genere da un <cache-path>
configurato.
Per ulteriori informazioni, vedi Condivisione di file. Assicurati di concedere a
Sharesheet le autorizzazioni corrette per leggere le immagini che vuoi utilizzare come miniatura. Per saperne di più, consulta Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Ecco un esempio:
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
L'anteprima sarà simile alla seguente:
Aggiungi azioni personalizzate al foglio di condivisione
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate a Android Sharesheet.
Le azioni personalizzate vengono mostrate sotto forma di piccole icone di azione nella parte superiore di Android Sharesheet e le app possono specificare qualsiasi Intent
come azione richiamata quando viene fatto clic sull'icona.
Per aggiungere azioni personalizzate in Android Sharesheet, crea prima un ChooserAction
con ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione che viene richiamata quando si fa clic sull'icona. Crea
un array contenente tutte le azioni personalizzate e specificalo come
EXTRA_CHOOSER_CUSTOM_ACTIONS
della condivisione Intent
.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Aggiungi target personalizzati
Il foglio di condivisione di Android consente di specificare fino a due oggetti ChooserTarget
che vengono visualizzati prima delle scorciatoie di condivisione e delle destinazioni del selettore caricate da ChooserTargetServices
. Puoi anche specificare fino a due intent che puntino alle attività elencate prima dei suggerimenti dell'app:
Aggiungi Intent.EXTRA_CHOOSER_TARGETS
e Intent.EXTRA_INITIAL_INTENTS
all'intent di condivisione dopo la chiamata Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Usa questa funzionalità con attenzione. Ogni volta che aggiungi Intent
e ChooserTarget
personalizzati, riduci il numero suggerito dal sistema. In genere sconsigliamo di aggiungere target personalizzati. Un esempio comune e appropriato di aggiunta di Intent.EXTRA_INITIAL_INTENTS
è fornire ulteriori azioni che gli utenti possono eseguire sui contenuti condivisi. Ad esempio, un utente condivide immagini e Intent.EXTRA_INITIAL_INTENTS
viene utilizzato per
consentire di inviare un link. Un esempio comune e appropriato di aggiunta di Intent.EXTRA_CHOOSER_TARGETS
è la visualizzazione di persone o dispositivi pertinenti forniti dalla tua app.
Escludi target specifici per componente
Puoi escludere target specifici fornendo Intent.EXTRA_EXCLUDE_COMPONENTS
.
Esegui questa operazione solo per rimuovere i target su cui hai il controllo. Un caso d'uso comune è nascondere i target di condivisione dell'app quando gli utenti condividono contenuti dall'app, in quanto è probabile che il loro intento li condivida all'esterno dell'app.
Aggiungi Intent.EXTRA_EXCLUDE_COMPONENTS
all'intent dopo aver chiamato Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
Ottieni informazioni sulla condivisione
Può essere utile sapere quando gli utenti condividono contenuti e quale target selezionano. Il foglio di condivisione Android ti consente di ottenere queste informazioni fornendo il ComponentName
dei target selezionati dagli utenti utilizzando un IntentSender
.
Innanzitutto crea un PendingIntent
per un BroadcastReceiver
e fornisci il relativo IntentSender
in Intent.createChooser()
:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
Ricevi il callback in MyBroadcastReceiver
e cerca in
Intent.EXTRA_CHOSEN_COMPONENT
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Aggiungi azioni personalizzate al foglio di condivisione
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate a Android Sharesheet.
Crea un ChooserAction
con
ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione che viene richiamata quando si fa clic sull'icona. Crea
un array contenente tutte le azioni personalizzate e specificalo come
EXTRA_CHOOSER_CUSTOM_ACTIONS
della condivisione Intent
.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Utilizzare lo strumento Android intent resolver
Il resolver di intent di Android viene utilizzato al meglio per inviare dati a un'altra app nell'ambito di un flusso di attività ben definito.
Per utilizzare il resolver di intent di Android, crea un intent e aggiungi altre opzioni come faresti per chiamare il foglio di condivisione di Android. Tuttavia, non chiamare
Intent.createChooser()
.
Se sono installate più applicazioni installate con filtri che corrispondono a ACTION_SEND
e al tipo MIME, il sistema visualizza una finestra di dialogo di disambiguazione denominata intent resolver, che consente all'utente di scegliere una destinazione con cui condividere. Se una singola applicazione corrisponde, viene eseguita.
Ecco un esempio di come utilizzare il resolver intent di Android per inviare testo:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
Scopri di più
Per maggiori informazioni sull'invio di dati, consulta Filtri per intent e intent.