Android utilizza gli intent e le funzionalità aggiuntive associate per consentire agli utenti di condividere informazioni in modo rapido e facile tramite le loro app preferite.
Android offre due modi per consentire agli utenti di condividere dati tra 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, la condivisione di 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, apri un PDF dalla tua app e consenti agli utenti di scegliere il visualizzatore che preferiscono.
Quando crei un intent, devi specificare l'azione che deve essere eseguita da quell'intent.
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 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à può gestire l'intent, questa verrà avviata immediatamente.
Perché utilizzare la scheda di condivisione di Android
Ti consigliamo vivamente di utilizzare Android Sharesheet per garantire la coerenza degli utenti tra le app. Non visualizzare l'elenco di destinazioni di condivisione della tua app e non creare varianti di Sharesheet.
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 i target non disponibili per soluzioni personalizzate e utilizza un ranking coerente. Questo perché Sharesheet può prendere in considerazione informazioni sull'attività delle app e degli utenti disponibili solo per il sistema.
La scheda di condivisione di Android offre anche molte funzionalità utili per gli sviluppatori. Ad esempio, puoi:
- Scoprire quando gli utenti completano una condivisione e dove
- Aggiungere
ChooserTarget
e target dell'app personalizzati - Fornire anteprime di 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'intenzione e imposta la relativa azione su
Intent.ACTION_SEND
.
Per visualizzare Android Sharesheet, chiama
Intent.createChooser()
,
trasmettendolo il tuo oggetto Intent
.
Restituisce una versione dell'intent che mostra sempre la scheda di condivisione di Android.
Invia contenuti testuali
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 attualmente visualizzata come testo con un'altra app. Questa funzionalità è utile per condividere un articolo o un sito web con gli amici tramite email o social network. Ecco un esempio di come procedere:
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 altri elementi per includere ulteriori informazioni, ad esempio i destinatari
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
l'oggetto dell'email
(EXTRA_SUBJECT
) e così via.
Nota: alcune app email, come Gmail, si aspettano un String[]
per 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.
Viene comunemente utilizzato per condividere un'immagine, ma può essere utilizzato per condividere qualsiasi tipo di contenuti binari.
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 destinazione deve disporre dell'autorizzazione per accedere ai dati a cui fa riferimento Uri
. Puoi farlo 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 consiste nell'utilizzare le autorizzazioni per URI, che sono temporanee e che concedono l'accesso solo all'applicazione ricevente. Un modo semplice per creare unContentProvider
come questo è usare il corso helperFileProvider
. - Utilizza il
MediaStore
di sistema.MediaStore
è destinato principalmente ai tipi MIME video, audio e immagine. Tuttavia, a partire da Android 3.0 (livello API 11), è possibile 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.
Utilizzare il tipo MIME corretto
Fornisci il tipo MIME più specifico disponibile per i dati
che invii. Ad esempio, utilizza text/plain
quando condividi testo normale. Ecco alcuni tipi MIME comuni durante l'invio di dati semplici in Android:
I ricevitori si registrano per | Mittenti che inviano |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Estensioni dei file supportate | application/pdf |
Per saperne di più sui tipi MIME, consulta il registry ufficiale dei tipi di media MIME di IANA.
Android Sharesheet 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 a seconda
del mix di contenuti condivisi. Ad esempio, se condividi tre immagini JPEG, utilizza il tipo
"image/jpg"
. Per una combinazione di tipi di immagini, utilizza "image/*"
per abbinare un'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
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 indirizzino i dati a cui un'applicazione di ricezione può accedere.
Aggiungi contenuti avanzati alle anteprime di testo
A partire da Android 10 (livello API 29), la scheda di condivisione di 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 su ciò che viene condiviso.
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 Intent.createChooser()
e aggiungi una
miniatura pertinente utilizzando 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 necessarie per leggere qualsiasi immagine che vuoi utilizzare come miniatura. Per ulteriori informazioni, 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 ha il seguente aspetto:
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.
Le azioni personalizzate vengono mostrate come piccole icone di azione nella parte superiore di Android Sharesheet e le app possono specificare qualsiasi Intent
come azione richiamata quando l'icona viene selezionata.
Per aggiungere azioni personalizzate nella scheda Condivisione di Android, crea prima 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 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
Android Sharesheet ti consente di specificare fino a due oggetti ChooserTarget
che vengono mostrati prima delle scorciatoie di condivisione e delle destinazioni dei selettori caricati da ChooserTargetServices
. Puoi anche specificare fino a due intent che rimandano ad attività elencate prima dei suggerimenti di app:
Aggiungi Intent.EXTRA_CHOOSER_TARGETS
e Intent.EXTRA_INITIAL_INTENTS
all'intenzione 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);
Utilizza questa funzionalità con cautela. Ogni elemento Intent
e ChooserTarget
personalizzato che aggiungi riduce il numero suggerito dal sistema. In genere sconsigliamo
di aggiungere target personalizzati. Un esempio appropriato e comune 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
consentirgli di inviare un link. Un esempio comune e appropriato di aggiunta di Intent.EXTRA_CHOOSER_TARGETS
è mostrare persone o dispositivi pertinenti forniti dalla tua app.
Escludi target specifici in base al 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 target delle condivisioni dell'app quando gli utenti condividono contenuti all'interno dell'app, poiché è probabile che la loro intenzione sia quella di condividere contenuti all'esterno dell'app.
Aggiungi Intent.EXTRA_EXCLUDE_COMPONENTS
al tuo 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);
Ricevere informazioni sulla condivisione
Può essere utile sapere quando gli utenti condividono e quale target selezionano. La scheda 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 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); }
Aggiungi azioni personalizzate a Sharesheet
Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate a Sharesheet di Android.
Crea una ChooserAction
con
ChooserAction.Builder
.
Puoi specificare un PendingIntent
come azione richiamata quando l'icona viene selezionata. 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 di Android
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 chiama
Intent.createChooser()
.
Se sono presenti più applicazioni installate con filtri corrispondenti a
ACTION_SEND
e al tipo MIME, il sistema mostra una finestra di dialogo di disambiguazione denominata intent resolver
che consente all'utente di scegliere una destinazione con cui eseguire la condivisione. Se una singola applicazione corrisponde, viene eseguita.
Ecco un esempio di come utilizzare il risolutore di intent di 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, consulta Intent e filtri intent.