Inviare dati semplici ad altre app

Android utilizza gli intent e gli extra associati 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 app:

  • Il foglio di condivisione di Android è progettato 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 dell'intent Android è ideale per passare i 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 che preferiscono.

Quando crei un intent, devi specificare l'azione che vuoi che esegua. Android utilizza l'azione ACTION_SEND per inviare dati da un'attività all'altra, anche oltre i confini del processo. Devi specificare i dati e il tipo. Il sistema identifica automaticamente le attività compatibili che possono ricevere i dati e le mostra all'utente. Nel caso del resolver dell'intent, se solo un'attività è in grado di gestire l'intent, l'attività inizia immediatamente.

Perché utilizzare il foglio di condivisione di Android

Ti consigliamo vivamente di utilizzare il foglio di condivisione di Android per creare coerenza per i tuoi utenti tra le app. Non visualizzare l'elenco di destinazioni di condivisione della tua app e non creare varianti del foglio di condivisione personalizzate.

Il foglio 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 target non disponibili per soluzioni personalizzate e utilizza un ranking coerente. Questo perché Sharesheet può prendere in considerazione informazioni su attività di app e utenti disponibili solo per il sistema.

Android Sharesheet offre anche molte funzioni utili per gli sviluppatori. Ad esempio, puoi:

Usare 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 di Android, chiama Intent.createChooser(), passandogli l'oggetto Intent. Restituisce una versione dell'intent che mostra sempre il foglio di condivisione di Android.

Invia contenuti testuali

L'uso più diretto e comune di Android Sharesheet è inviare contenuti testuali 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. Questo è utile per condividere un articolo o un sito web con gli amici tramite email o social network. Ecco un esempio di come eseguire questa operazione:

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 aggiungerle al tuo intent.

Invia contenuti binari

Condividi i dati binari utilizzando l'azione ACTION_SEND. Imposta il tipo MIME appropriato e inserisci un URI ai dati nel campo EXTRA_STREAM aggiuntivo, come mostrato nell'esempio seguente. Di solito viene 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 deve avere l'autorizzazione per accedere ai dati a cui rimanda Uri. Esistono due modi consigliati per farlo:

  • Archivia i dati nel tuo ContentProvider, assicurandoti che le altre app abbiano l'autorizzazione corretta per accedere al tuo provider. Il meccanismo preferito per fornire l'accesso è utilizzare le autorizzazioni per URI, che sono temporanee e concedono l'accesso solo all'applicazione ricevente. Un modo semplice per creare un ContentProvider come questo è utilizzare la classe helper FileProvider.
  • Utilizza il sistema MediaStore. MediaStore è principalmente per i tipi MIME video, audio e immagine. Tuttavia, a partire da Android 3.0 (livello API 11), può anche archiviare tipi non multimediali. Per ulteriori informazioni, consulta MediaStore.Files. I file possono essere inseriti in MediaStore utilizzando scanFile(), dopodiché un Uri in stile content:// adatto per la 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 il testo normale. Ecco alcuni tipi MIME comuni per l'invio di dati semplici in Android:

Ricevitori registrati per I mittenti 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 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é al destinatario non è chiaro quale sia il motivo dell'invio. 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 può accedere un'applicazione ricevente.

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 capire. Valuta la possibilità di condividere un URL complesso come https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Un'anteprima più completa può rassicurare gli utenti sulla condivisione.

Se stai visualizzando l'anteprima del testo, puoi impostare un titolo, un'immagine in miniatura o entrambe. 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 concedere a Sharesheet le autorizzazioni corrette per leggere le immagini che vuoi usare 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:

Aggiungi azioni personalizzate al foglio 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 a Sharesheet 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 che viene richiamata quando viene fatto clic sull'icona.

Per aggiungere azioni personalizzate al foglio di condivisione di Android, devi prima creare un elemento ChooserAction con ChooserAction.Builder. Puoi specificare un PendingIntent come azione richiamata 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

Il foglio di condivisione di Android 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 puntano alle attività elencate prima dei suggerimenti delle 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 funzione con cautela. Ogni elemento Intent e ChooserTarget personalizzato che aggiungi riduce il numero suggerito dal sistema. In genere sconsigliamo l'aggiunta di target personalizzati. Un esempio comune e appropriato dell'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 all'utente di inviare un link. Un esempio comune e appropriato di come aggiungere Intent.EXTRA_CHOOSER_TARGETS è mostrare le persone o i dispositivi pertinenti forniti dalla tua app.

Escludere target specifici per componente

Per escludere target specifici, fornisci Intent.EXTRA_EXCLUDE_COMPONENTS. Esegui questa operazione solo per rimuovere i target su cui hai il controllo. Un caso d'uso comune è nascondere le quote di condivisione della tua app quando gli utenti condividono contenuti dall'interno dell'app, perché è probabile che il loro intento condivida la condivisione 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);

Ottieni informazioni sulla condivisione

Può essere utile sapere quando i tuoi utenti condividono contenuti e quale target selezionano. Il foglio di condivisione di 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 i relativi 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 Sharesheet 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 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);

Utilizzare il resolver dell'intent Android

Screenshot del resolver dell'intent ACTION_SEND.

Il resolver dell'intent Android è ideale per l'invio di dati a un'altra app come parte di un flusso di attività ben definito.

Per utilizzare il resolver dell'intent Android, crea un intent e aggiungi gli extra come faresti per il foglio di condivisione di Android. Tuttavia, non chiamare Intent.createChooser().

Se sono presenti più applicazioni installate con filtri che corrispondono a ACTION_SEND e al tipo MIME, il sistema mostra una finestra di dialogo di disambiguazione chiamata intent resolver, che consente all'utente di scegliere una destinazione con cui condividere. Se una singola applicazione corrisponde, viene eseguita.

Di seguito è riportato un esempio di come utilizzare il resolver dell'intent 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 ulteriori informazioni sull'invio dei dati, consulta la pagina relativa ai filtri per intent e intent.