Inviare dati semplici ad altre app

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:

  • Sharesheet di Android è progettato 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, aprire un PDF dalla tua app per consentire agli utenti di scegli il visualizzatore che preferisci.

Quando crei un intent, devi specificare l'azione che deve essere eseguita da quell'intent. Android utilizza l'azione ACTION_SEND di 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 può 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 di target di condivisione della tua app e non crearne uno tuo Varianti di Sharesheet.

Android Sharesheet consente agli utenti di condividere informazioni con 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 segui questi passaggi:

Utilizza Android Sharesheet

Per tutti i tipi di condivisione, crea un intent e imposta la sua azione su Intent.ACTION_SEND. Per visualizzare Android Sharesheet, chiama Intent.createChooser(), passando il tuo oggetto Intent. Restituisce una versione del tuo intent che mostra sempre Android Sharesheet.

Invia contenuti testuali

L'uso più semplice e comune di Android Sharesheet è l'invio di contenuti di testo da 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:

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 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 le funzionalità di putExtra(String, String[]) per aggiungerli al tuo intent.

Invia contenuti binari

Condividi dati binari utilizzando l'azione ACTION_SEND. Imposta il tipo MIME appropriato e inserisci un URI per i dati nella casella EXTRA_STREAM, come come mostrato nell'esempio che segue. Di solito viene utilizzato per condividere un'immagine, ma può essere usato 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 necessita dell'autorizzazione per accedere ai dati di Uri a cui rimanda. Puoi farlo in due modi:

  • Archivia i dati nel tuo ContentProvider, assicurandoti che le altre dispongono dell'autorizzazione corretta per accedere al tuo provider. 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 creare ContentProvider come questo consiste nell'utilizzare Corso helper FileProvider.
  • Utilizza il sistema MediaStore. MediaStore riguarda principalmente i tipi MIME video, audio e immagine. Tuttavia, a partire da Android 3.0 (API livello 11), può anche archiviare tipi non multimediali. Per ulteriori informazioni, vedi MediaStore.Files. I file possono essere inseriti in MediaStore utilizzando scanFile(), dopodiché Uri in stile content:// idonei per la condivisione viene trasmesso all'account onScanCompleted() di Google. Tieni presente che, una volta aggiunti al sistema MediaStore, i contenuti sono accessibili a qualsiasi app sul dispositivo.

Utilizzare il tipo MIME corretto

Fornisci il tipo MIME più specifico disponibile per i dati in tuo possesso invio. 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 Invio dei mittenti
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 le IANA registro ufficiale dei tipi multimediali MIME.

Android Sharesheet potrebbe mostrare un'anteprima dei contenuti, a seconda del tipo MIME fornito. Alcune sono disponibili solo per tipi specifici.

Condividere più contenuti

Per condividere più contenuti, utilizza ACTION_SEND_MULTIPLE insieme a un elenco di URI che puntano ai contenuti. Il tipo MIME varia a seconda un 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 corrispondenza attività che gestisce qualsiasi tipo di immagine. È possibile condividere un mix di tipi diversi, ma dissuaderlo, dal momento che al destinatario non è chiaro cosa intende inviare. Se devi inviare più tipi, utilizza "*/*". Spetta all'applicazione ricevente l'analisi ed elaborare i tuoi 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 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ù 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 il numero Intent.createChooser() e aggiungi un miniatura pertinente utilizzando ClipData.

Nota: l'URI del contenuto dell'immagine viene fornito da un FileProvider, solitamente 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, 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 ha un aspetto simile a questo:

Aggiungi azioni personalizzate a Sharesheet

Screenshot di azioni personalizzate su Android Sharesheet.

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 puoi specificare qualsiasi Intent come azione richiamata quando l'icona viene selezionata.

Per aggiungere azioni personalizzate su Android Sharesheet, devi prima creare un ChooserAction con ChooserAction.Builder. Puoi specificare un PendingIntent come azione richiamata quando l'icona viene selezionata. Crea un array contenente tutte le tue azioni personalizzate e specificalo come EXTRA_CHOOSER_CUSTOM_ACTIONS della quota 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);

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():

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 Intent personalizzato e ChooserTarget che aggiungi riduce il numero suggerito dal sistema. In genere, scoraggiano l'aggiunta di destinazioni personalizzate. Un esempio appropriato e comune di aggiunta L'obiettivo Intent.EXTRA_INITIAL_INTENTS è fornire ulteriori azioni che gli utenti possono eseguire sugli elementi condivisi contenuti. Ad esempio, un utente condivide immagini e Intent.EXTRA_INITIAL_INTENTS è abituato a 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.

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 target di quota dell'app quando gli utenti condividono contenuti dall'interno dell'app, poiché è probabile che la loro intenzione venga condivisa 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 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 forniscine il IntentSender a 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 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 un ChooserAction con ChooserAction.Builder. Puoi specificare un PendingIntent come azione richiamata quando l'icona viene selezionata. Crea un array contenente tutte le tue azioni personalizzate e specificalo come EXTRA_CHOOSER_CUSTOM_ACTIONS della quota 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

Screenshot del resolver di intent di 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 usare lo strumento Intent resolver di Android, crea un intent e aggiungi degli extra come faresti con la chiamata Android Sharesheet. 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 chiamata 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:

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 di dati, vedi Filtri per intent e intent.