Inviare dati semplici ad altre app

Android utilizza gli intent e gli extra associati per consentire agli utenti di condividere informazioni rapidamente e facilmente utilizzando 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 risolutore di intent di Android è più adatto per il passaggio dei 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'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 i dati e il relativo tipo. Il sistema identifica automaticamente le attività compatibili che possono ricevere i dati e li mostra all'utente. Nel caso del risolutore di intent, se solo un'attività può gestire l'intent, questa viene avviata immediatamente.

Perché utilizzare Android Sharesheet

Ti consigliamo vivamente di utilizzare la scheda di condivisione di Android per creare coerenza per gli utenti tra le app. Non mostrare l'elenco dei target di 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. La scheda di condivisione può suggerire target non disponibili per le soluzioni personalizzate e utilizza un ranking coerente. Questo perché la scheda Condividi può prendere in considerazione informazioni sull'attività dell'app e dell'utente che sono disponibili solo per il sistema.

La scheda di condivisione di Android offre anche molte funzionalità utili per gli sviluppatori. Ad esempio, puoi:

Utilizzare la scheda Condivisione di Android

Per tutti i tipi di condivisione, crea un'intenzione e imposta la relativa 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 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 elementi extra per includere ulteriori 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, 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. Esistono due modi consigliati per farlo:

  • 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 accesso è utilizzare le autorizzazioni per URI, che sono temporanee e consentono l'accesso solo all'applicazione di destinazione. Un modo semplice per creare un ContentProvider come questo è utilizzare la classe di supporto FileProvider.
  • Utilizza il MediaStore di sistema. MediaStore è destinato principalmente ai tipi MIME di video, audio e immagini. Tuttavia, a partire da Android 3.0 (livello API 11), può memorizzare anche tipi di contenuti non multimediali. Per ulteriori informazioni, consulta MediaStore.Files. I file possono essere inseriti in MediaStore utilizzando scanFile(), dopodiché un Uri in stile content:// adatto alla condivisione viene passato al callback onScanCompleted() fornito. Tieni presente che, una volta aggiunti al sistema MediaStore, 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 tipi MIME comuni per l'invio di dati semplici in Android:

I destinatari si registrano per Mittenti che inviano
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Estensioni dei file supportate application/pdf

Per saperne di più sui tipi MIME, consulta il registry ufficiale dei tipi di media MIME di IANA.

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 al combinato di contenuti che stai condividendo. Ad esempio, se condividi tre immagini JPEG, utilizza 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 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 di destinazione analizzare e 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.

Aggiungere contenuti avanzati alle anteprime dei testi

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 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 Condividere 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

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 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 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

La scheda di condivisione di Android ti consente di specificare fino a due oggetti ChooserTarget che vengono visualizzati prima delle scorciatoie di condivisione e dei target del selettore 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 Intent e ChooserTarget personalizzato 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 comune e appropriato di aggiunta di Intent.EXTRA_CHOOSER_TARGETS è mostrare persone o dispositivi pertinenti forniti dalla tua app.

Escludere target specifici per componente

Puoi escludere target specifici specificando 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 dell'app quando gli utenti condividono contenuti dall'interno dell'app, in quanto è probabile che la loro intenzione sia 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);

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 i 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 la chiamata in MyBroadcastReceiver e controlla 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 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 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 risolutore di intent di Android

Screenshot del risolutore di intent ACTION_SEND.

Il risolutore di 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 installate più applicazioni con filtri corrispondenti ACTION_SEND e al tipo MIME, il sistema mostra una finestra di dialogo di disambiguazione chiamata risolvere intent 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 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.