Android utilizza gli intent e le funzionalità aggiuntive associate per consentire agli utenti di condividere rapidamente le informazioni usando le loro app preferite.
Android offre agli utenti due modi per condividere dati tra le app:
- La scheda Condivisione di Android è progettata principalmente per inviare contenuti al di fuori della tua app e/o direttamente a un altro utente. Ad esempio, quando condividi un URL con un amico.
- Il risolutore di intent di Android è più adatto per passare dati fase successiva di un'attività ben definita. Ad esempio, apri un PDF dalla tua app e consenti agli utenti di scegliere il visualizzatore che preferiscono.
Quando crei un'intenzione, specifichi l'azione che vuoi che venga eseguita.
Android utilizza l'azione ACTION_SEND
per inviare dati da un'attività all'altra, anche oltre i confini dei processi. Devi specificare
tra i dati e il tipo. Il sistema identifica automaticamente le attività compatibili che possono ricevere i dati e li mostra all'utente. Nel caso del resolver di intent,
se solo un'attività è in grado di gestire l'intento, questa viene avviata immediatamente.
Perché utilizzare Android Sharesheet

Ti consigliamo vivamente di utilizzare Android Sharesheet per creare coerenza per i tuoi utenti su app. Non mostrare l'elenco dei destinatari della condivisione della tua app o creare le tue varianti della scheda di condivisione.
La scheda di condivisione di Android consente agli utenti di condividere informazioni con la persona giusta, con suggerimenti di app pertinenti, il tutto con un solo tocco. Sharesheet può suggerire i target non disponibili per soluzioni personalizzate e utilizza un ranking coerente. Questo perché Sharesheet può tenere conto delle informazioni sull'app e sull'attività utente disponibili solo per il sistema.
Android Sharesheet offre anche molte utili funzionalità per gli sviluppatori. Ad esempio, puoi procedi nel seguente modo:
- Scoprire quando gli utenti completano una condivisione e dove
- Aggiungere un
ChooserTarget
e target di app personalizzati - Fornire anteprime dei contenuti di testo avanzato, a partire da Android 10 (livello API 29)
- Escludere i target che corrispondono a nomi di componenti specifici
Utilizzare la scheda Condivisione di Android
Per tutti i tipi di condivisione, crea un intent e imposta la sua azione su
Intent.ACTION_SEND
.
Per visualizzare la scheda di condivisione di Android, chiama
Intent.createChooser()
,
passandogli l'oggetto Intent
.
Restituisce una versione dell'intent che mostra sempre la scheda di condivisione di Android.
Inviare contenuti di testo
L'utilizzo più semplice e comune della scheda Condividi di Android è inviare contenuti di testo da un'attività all'altra. Ad esempio, la maggior parte dei browser può condividere l'URL della pagina pagina come testo con un'altra app. È utile per condividere un articolo o un sito web con gli amici tramite email o sui social network. Ecco un esempio di come procedere:
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)
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 altri elementi per includere maggiori 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 contenuti extra come
EXTRA_EMAIL
e EXTRA_CC
. Utilizza
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 per i dati nell'extraEXTRA_STREAM
, come mostrato nell'esempio seguente.
Di solito viene utilizzato per condividere un'immagine, ma può essere usato per condividere qualsiasi tipo di contenuto binario.
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))
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 necessita dell'autorizzazione per accedere ai dati di Uri
a cui rimanda. Puoi farlo in due modi:
- Memorizza i dati nel tuo
ContentProvider
, assicurandoti che le altre app dispongano dell'autorizzazione corretta per accedere al tuo fornitore. Il meccanismo preferito per fornire l'accesso è usare le autorizzazioni per URI, che sono temporaneamente e concedere l'accesso soltanto all'applicazione ricevente. Un modo semplice per creareContentProvider
come questo consiste nell'utilizzare Corso helperFileProvider
. - Utilizza il
MediaStore
di sistema.MediaStore
è destinato principalmente ai tipi MIME di video, audio e immagini. Tuttavia, a partire da Android 3.0 (API livello 11), può anche archiviare tipi non multimediali. Per ulteriori informazioni, vediMediaStore.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 stai inviando. Ad esempio, utilizza text/plain
quando condividi testo normale. Ecco alcuni esempi
tipi MIME comuni durante l'invio di dati semplici in Android:
I destinatari si registrano a | Mittenti che inviano |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Estensioni dei file supportate | application/pdf |
Per ulteriori informazioni sui tipi MIME, consulta le IANA registro ufficiale dei tipi multimediali MIME.
La scheda di condivisione di Android potrebbe mostrare un'anteprima dei contenuti, a seconda del tipo MIME fornito. 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 alla combinazione di contenuti che stai condividendo. Ad esempio, se condividi tre immagini JPEG, utilizzi il tipo
"image/jpg"
. Per una combinazione di tipi di immagini, utilizza "image/*"
per trovare una corrispondenza
attività che gestisce qualsiasi tipo di immagine. Sebbene sia possibile condividere una combinazione di tipi, sconsigliamo vivamente di farlo, perché non è chiaro al destinatario cosa si intende inviare. Se è necessario inviare più tipi, utilizza
"*/*"
. Spetta all'applicazione ricevente l'analisi
ed elaborare i tuoi dati. Ecco un esempio:
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))
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 l'oggetto Uri
fornito punti
ai dati a cui un'applicazione ricevente può accedere.
Aggiungi contenuti avanzati alle anteprime di testo
A partire da Android 10 (livello API 29), Android Sharesheet mostra un'anteprima del testo che viene
condiviso. In alcuni casi, il testo che viene condiviso può essere difficile da comprendere. Valuta la possibilità di condividere un URL complicato come https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Un modo più ricco
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 dei contenuti dell'immagine viene fornito da un
FileProvider
, in genere da un <cache-path>
configurato.
Per ulteriori informazioni, vedi Condivisione di file. Assicurati di dare
Sharesheet con le autorizzazioni corrette per leggere le immagini che vuoi utilizzare come miniatura. Per ulteriori informazioni, consulta Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Ecco un esempio:
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)
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 ha il seguente aspetto:

Aggiungi azioni personalizzate a Sharesheet

Screenshot delle azioni personalizzate nella scheda di condivisione di Android.
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate alla scheda di condivisione di Android.
Le azioni personalizzate vengono visualizzate come piccole icone di azioni nella parte superiore della scheda di condivisione di Android e le app possono specificare qualsiasi Intent
come azione invocata quando si fa clic sull'icona.
Per aggiungere azioni personalizzate su Android Sharesheet, devi prima creare un
ChooserAction
con
ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione invocata quando si fa clic sull'icona. Crea un array contenente tutte le azioni personalizzate e specificalo come EXTRA_CHOOSER_CUSTOM_ACTIONS
della condivisione Intent
.
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)
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
Android Sharesheet ti consente di specificare fino a due oggetti ChooserTarget
che
vengono visualizzate prima delle scorciatoie di condivisione e dei target dei selettori caricati da ChooserTargetServices
. Puoi anche
specificare fino a due intent che indirizzino alle attività elencate
prima dei suggerimenti dell'app:

Aggiungi Intent.EXTRA_CHOOSER_TARGETS
e Intent.EXTRA_INITIAL_INTENTS
a
il tuo intent di condivisione dopo la chiamata
Intent.createChooser()
:
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Usa questa funzione 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 consentirgli di inviare un link. Un esempio appropriato comune dell'aggiunta di Intent.EXTRA_CHOOSER_TARGETS
è far emergere persone o dispositivi pertinenti forniti dalla tua app.
Escludere target specifici per componente
Per escludere target specifici, fornisci il valore Intent.EXTRA_EXCLUDE_COMPONENTS
.
Esegui questa operazione solo per rimuovere i target su cui hai il controllo. Un caso d'uso comune è nascondere i destinatari della condivisione della tua app quando gli utenti condividono contenuti dall'interno dell'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()
:
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) }
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. La
Android Sharesheet ti consente di ottenere queste informazioni fornendo ComponentName
di
sceglie come target gli utenti selezionati utilizzando un IntentSender
.
Innanzitutto, crea un PendingIntent
per un BroadcastReceiver
e fornisci il relativo
IntentSender
in Intent.createChooser()
:
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)
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 la chiamata in MyBroadcastReceiver
e controlla in
Intent.EXTRA_CHOSEN_COMPONENT
:
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Aggiungere azioni personalizzate al riquadro di condivisione
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate alla scheda di condivisione di Android.
Crea un ChooserAction
con
ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione invocata quando si fa clic sull'icona. Crea
un array contenente tutte le tue azioni personalizzate e specificalo come
EXTRA_CHOOSER_CUSTOM_ACTIONS
della quota Intent
.
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)
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 risolutore di intent di Android

Screenshot del risolutore di intent ACTION_SEND
.
Lo strumento di risoluzione degli intent di Android è ideale per inviare dati a un'altra app nell'ambito di un flusso di attività ben definito.
Per utilizzare il risolutore di intent di Android, crea un'intent e aggiungi gli extra come faresti per chiamare la scheda di condivisione di Android. Tuttavia, non chiamare
Intent.createChooser()
.
Se ci sono più applicazioni installate con filtri corrispondenti
ACTION_SEND
e il tipo MIME, il sistema visualizza una finestra di dialogo di disambiguazione denominata intent resolver
che consenta all'utente di scegliere
un target da condividere. Se una singola applicazione
corrisponde, viene eseguita.
Ecco un esempio di come utilizzare il resolver di intent di Android per inviare testo:
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
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, consulta Intent e filtri intent.