Android utilizza gli intent e i relativi extra 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 i dati tra le app:
- Android Sharesheet è progettata principalmente per inviare contenuti al di fuori della tua app e/o direttamente a un altro utente. Ad esempio, la condivisione di un URL con un amico.
- Il resolver di intent Android è più adatto per passare i dati alla fase successiva di un'attività ben definita. Ad esempio, aprendo un PDF dalla tua app e consentendo agli utenti di scegliere il visualizzatore che preferiscono.
Quando crei un intent, specifichi l'azione che vuoi che esegua.
Android utilizza l'intent ACTION_SEND
per inviare dati da un'attività all'altra,
anche tra i limiti 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 del resolver di intent,
se solo un'attività può gestire l'intent, questa viene avviata immediatamente.
Perché utilizzare Android Sharesheet

Consigliamo vivamente di utilizzare il foglio di condivisione di Android per creare coerenza per gli utenti tra le app. Non visualizzare l'elenco di destinazioni di condivisione della tua app o creare varianti del foglio di condivisione.
La scheda Condivisione di Android consente agli utenti di condividere informazioni con la persona giusta, con suggerimenti di app pertinenti, il tutto con un solo tocco. Il foglio di condivisione può suggerire target non disponibili per le soluzioni personalizzate e utilizza una classificazione coerente. Questo perché la scheda può prendere in considerazione informazioni sull'attività di app e utenti disponibili solo per il sistema.
Android Sharesheet offre anche molte funzionalità utili per gli sviluppatori. Ad esempio, puoi fare quanto segue:
- Scopri quando e con chi i tuoi utenti completano una condivisione
- Aggiungere un
ChooserTarget
e target di app personalizzati - Fornire anteprime dei contenuti in formato RTF a partire da Android 10 (livello API 29)
- Escludere i target che corrispondono a nomi di componenti specifici
Utilizzare Android Sharesheet
Per tutti i tipi di condivisione, crea un intent e imposta la relativa azione su
Intent.ACTION_SEND
.
Per visualizzare il foglio di condivisione di Android, chiama
Intent.createChooser()
,
passando l'oggetto Intent
.
Restituisce una versione dell'intent che mostra sempre il foglio di condivisione di Android.
Inviare contenuti di testo
L'utilizzo più semplice e comune di Android Sharesheet è l'invio di contenuti di testo da un'attività a un'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 tramite email o 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 extra per includere più informazioni, ad esempio i destinatari email
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
l'oggetto dell'email
(EXTRA_SUBJECT
) e così via.
Nota:alcune app email, come Gmail, prevedono un
String[]
per extra come
EXTRA_EMAIL
e EXTRA_CC
. Usa
putExtra(String, String[])
per aggiungerli all'intent.
Inviare contenuti binari
Condividi i dati binari utilizzando l'azione ACTION_SEND
.
Imposta il tipo MIME appropriato e inserisci un URI ai dati nell'extra
EXTRA_STREAM
, come
mostrato nell'esempio seguente.
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 di ricezione deve disporre dell'autorizzazione per accedere ai dati a cui fa riferimento Uri
. Esistono due modi consigliati per farlo:
- Archivia i dati nel tuo
ContentProvider
, assicurandoti che altre app dispongano dell'autorizzazione corretta per accedere al tuo fornitore. Il meccanismo preferito per fornire l'accesso è l'utilizzo delle autorizzazioni per URI, che sono temporanee e concedono l'accesso solo all'applicazione ricevente. Un modo semplice per creare unContentProvider
come questo è utilizzare la classe helperFileProvider
. - Utilizza
MediaStore
del sistema.MediaStore
è principalmente per i tipi MIME video, audio e immagine. Tuttavia, a partire da Android 3.0 (livello API 11), può memorizzare anche tipi non multimediali. Per ulteriori informazioni, vediMediaStore.Files
. I file possono essere inseriti inMediaStore
utilizzandoscanFile()
, dopo di che viene passato uncontent://
Uri
adatto alla condivisione al callbackonScanCompleted()
fornito. Tieni presente che una volta aggiunti al sistemaMediaStore
, i contenuti sono accessibili a qualsiasi app sul dispositivo.
Utilizzare il tipo MIME corretto
Fornisci il tipo MIME più specifico disponibile per i dati che stai
inviando. Ad esempio, utilizza text/plain
quando condividi testo normale. Ecco alcuni tipi MIME comuni per l'invio di dati semplici in Android:
I ricevitori si registrano | Invio mittenti |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Estensioni dei file supportate | application/pdf |
Per saperne di più sui tipi MIME, consulta il registro ufficiale dei tipi di media MIME dell'IANA.
A seconda del tipo MIME fornito, il foglio di condivisione di Android potrebbe mostrare un'anteprima dei contenuti. Alcune funzionalità di anteprima sono disponibili solo per tipi specifici.
Condividere 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 in base al
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 trovare una
attività che gestisce qualsiasi tipo di immagine. Sebbene sia possibile condividere un mix di tipi, lo sconsigliamo vivamente perché non è chiaro al destinatario cosa si intende inviare. 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
a dati a cui un'applicazione ricevente può accedere.
Aggiungere contenuti avanzati alle anteprime di testo
A partire da Android 10 (livello API 29), il foglio di condivisione di Android mostra un'anteprima del testo
condiviso. In alcuni casi, il testo condiviso può essere difficile da comprendere. Prendi in considerazione la condivisione di un URL
complesso come https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Un'anteprima
più ricca può rassicurare gli utenti su ciò che viene condiviso.
Se stai visualizzando l'anteprima di un testo, puoi impostare un titolo, un'immagine in miniatura o entrambi. Aggiungi una descrizione a
Intent.EXTRA_TITLE
prima di chiamare Intent.createChooser()
e aggiungi una
miniatura pertinente utilizzando ClipData
.
Nota:l'URI 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 qualsiasi immagine che vuoi utilizzare come miniatura. Per ulteriori informazioni,
vedi 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 è simile a questa:

Aggiungere azioni personalizzate al foglio di condivisione

Screenshot delle azioni personalizzate nel foglio di condivisione di Android.
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate al foglio di condivisione di Android.
Le azioni personalizzate vengono visualizzate come piccole icone di azione nella parte superiore di Android Sharesheet e le app
possono specificare qualsiasi Intent
come azione richiamata quando si fa clic sull'icona.
Per aggiungere azioni personalizzate al foglio di condivisione di Android, crea prima un
ChooserAction
con
ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione 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);
Aggiungere target personalizzati
Il foglio di condivisione di Android ti 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 puntano ad attività elencate
prima dei suggerimenti per le app:

Aggiungi Intent.EXTRA_CHOOSER_TARGETS
e Intent.EXTRA_INITIAL_INTENTS
all'intent di condivisione dopo aver chiamato 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 cautela. Ogni Intent
personalizzato
e ChooserTarget
che aggiungi riduce 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 azioni aggiuntive che gli utenti possono intraprendere sui contenuti
condivisi. Ad esempio, un utente condivide immagini e Intent.EXTRA_INITIAL_INTENTS
viene utilizzato per
consentire l'invio di un link. Un esempio comune e appropriato di aggiunta di Intent.EXTRA_CHOOSER_TARGETS
è quello di mostrare persone o dispositivi pertinenti forniti dalla tua app.
Escludere 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 intendano condividere contenuti al di fuori 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);
Ottenere informazioni sulla condivisione
Può essere utile sapere quando gli utenti condividono contenuti e quale target selezionano. La
scheda di condivisione di Android ti consente di ottenere queste informazioni fornendo l'ComponentName
delle
destinazioni selezionate 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 richiamo tra 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); }
Aggiungere azioni personalizzate al foglio di condivisione
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate al foglio di condivisione di Android.
Crea un ChooserAction
con
ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione 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 il resolver di intent Android

Screenshot del resolver di intent ACTION_SEND
.
Il resolver di intent Android è ideale per inviare dati a un'altra app nell'ambito di un flusso di attività ben definito.
Per utilizzare il resolver di intent Android, crea un intent e aggiungi extra come faresti per chiamare
Android Sharesheet. Tuttavia, non chiamare
Intent.createChooser()
.
Se sono installate più applicazioni con filtri che corrispondono a
ACTION_SEND
e al tipo MIME, il sistema visualizza una finestra di dialogo di disambiguazione chiamata intent resolver
che consente all'utente di scegliere una destinazione per la condivisione. Se una singola applicazione
corrisponde, viene eseguita.
Ecco un esempio di come utilizzare il resolver di intent Android per inviare un messaggio:
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 ulteriori informazioni sull'invio dei dati, vedi Intent e filtri per intent.