Inviare dati semplici ad altre app

Android utilizza gli intent e i relativi extra 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 i dati tra le app:

  • Android Sharesheet è 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 di intent Android è più adatto per passare dati alla fase successiva di un'attività ben definita. Ad esempio, aprendo un PDF dalla tua app e consentendo agli utenti di scegliere il visualizzatore che preferiscono.

Quando crei un intent, specifichi l'azione che vuoi che esegua. Android utilizza l'intent ACTION_SEND per inviare dati da un'attività all'altra, anche oltre i limiti del processo. Devi specificare i dati e il relativo tipo. Il sistema identifica automaticamente le attività compatibili che possono ricevere i dati e le mostra all'utente. Nel caso del resolver di intent, se solo un'attività può gestire l'intent, questa viene avviata immediatamente.

Perché utilizzare Android Sharesheet

Consigliamo vivamente di utilizzare Android Sharesheet per creare coerenza per gli utenti tra le app. Non visualizzare l'elenco di destinazioni di condivisione della tua app o creare varianti del foglio di condivisione.

Android Sharesheet consente agli utenti di condividere informazioni con la persona giusta, con suggerimenti di app pertinenti, il tutto con un solo tocco. Il foglio di condivisione può suggerire destinazioni non disponibili per le soluzioni personalizzate e utilizza una classificazione coerente. Questo perché lo Sharesheet può prendere in considerazione informazioni sull'attività di app e utenti disponibili solo per il sistema.

Android Sharesheet offre anche molte funzionalità utili per gli sviluppatori. Ad esempio, puoi fare quanto segue:

Utilizzare Android Sharesheet

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

Inviare contenuti di testo

L'utilizzo più semplice e comune di Android Sharesheet è l'invio di contenuti di testo 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. Ciò è utile per condividere un articolo o un sito web con gli amici tramite email o social network. Ecco un esempio di come fare:

fun shareText(context: Context) {
    val sendIntent: Intent = Intent().apply {
        action = ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }

    val shareIntent = Intent.createChooser(sendIntent, null)
    context.startActivity(shareIntent)
}

Se vuoi, puoi aggiungere extra per includere più 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 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 ai dati nell'extra EXTRA_STREAM, come mostrato nell'esempio seguente. Viene comunemente utilizzato per condividere un'immagine, ma può essere utilizzato per condividere qualsiasi tipo di contenuto binario.

fun shareBinaryContent(context: Context) {
    val shareIntent: Intent = Intent().apply {
        action = ACTION_SEND
        // Example: content://com.google.android.apps.photos.contentprovider/...
        val imageUri: Uri =
            Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1")
        putExtra(Intent.EXTRA_STREAM, imageUri)
        type = "image/jpeg"
    }
    context.startActivity(Intent.createChooser(shareIntent, null))
}

L'applicazione ricevente 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 altre app dispongano dell'autorizzazione corretta per accedere al tuo provider. Il meccanismo preferito per fornire l'accesso è l'utilizzo delle 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 MediaStore del sistema. MediaStore è principalmente per i tipi MIME video, audio e immagine. Tuttavia, a partire da Android 3.0 (livello API 11), può memorizzare anche tipi non multimediali. Per saperne di più, consulta MediaStore.Files. I file possono essere inseriti in MediaStore utilizzando scanFile(), dopo di che viene passato un content:// Uri adatto alla condivisione al callback onScanCompleted() fornito. 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 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 ricevitori si registrano per Mittenti inviati
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 registro ufficiale dei tipi di media MIME dell'IANA.

A seconda del tipo MIME fornito, l'Android Sharesheet potrebbe mostrare un'anteprima dei contenuti. 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 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 con un'attività che gestisce qualsiasi tipo di immagine. Sebbene sia possibile condividere un mix di tipi, lo sconsigliamo vivamente 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:

fun shareMultiple(context: Context) {
    val imageUris: ArrayList<Uri> = arrayListOf(
        Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"),
        Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2")
    )

    val shareIntent = Intent().apply {
        action = Intent.ACTION_SEND_MULTIPLE
        putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
        type = "image/*"
    }
    context.startActivity(Intent.createChooser(shareIntent, null))
}

Assicurati che gli oggetti Uri forniti puntino a dati a cui un'applicazione di ricezione può accedere.

Aggiungere contenuti avanzati alle anteprime di testo

A partire da Android 10 (livello API 29), Android Sharesheet mostra un'anteprima del testo condiviso. In alcuni casi, il testo condiviso può essere difficile da comprendere. Prendi in considerazione la condivisione di un URL complesso come https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Un'anteprima più ricca 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 contenuto 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 corrette per leggere qualsiasi immagine che vuoi utilizzare come miniatura. Per saperne di più, vedi Intent.FLAG_GRANT_READ_URI_PERMISSION.

Ecco un esempio:

fun richContentToTextPreviewShares(context: Context) {
    val share = Intent.createChooser(
        Intent().apply {
            action = 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 =
                Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789")
            flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
        },
        null
    )
    context.startActivity(share)
}

L'anteprima è simile a questa:

Aggiungere azioni personalizzate al foglio di condivisione

Screenshot delle azioni personalizzate nell'Android Sharesheet.

Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate all'Android Sharesheet. Le azioni personalizzate vengono visualizzate come piccole icone di azione nella parte superiore di Android Sharesheet e le app possono specificare qualsiasi Intent come azione richiamata quando si fa clic sull'icona.

Per aggiungere azioni personalizzate all'Android Sharesheet, crea prima un ChooserAction con ChooserAction.Builder. Puoi specificare un PendingIntent come azione richiamata quando viene fatto clic sull'icona. Crea un array contenente tutte le tue azioni personalizzate e specificalo come EXTRA_CHOOSER_CUSTOM_ACTIONS della condivisione Intent.

fun sharesheetCustomActions(context: Context, previewText: String) {
    val sendIntent = Intent(ACTION_SEND)
        .setType("text/plain")
        .putExtra(Intent.EXTRA_TEXT, previewText)
    val shareIntent = Intent.createChooser(sendIntent, null)
    val customActions = arrayOf(
        ChooserAction.Builder(
            Icon.createWithResource(context, R.drawable.ic_logo),
            "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)
}

Aggiungere target personalizzati

Il foglio di condivisione di Android ti consente di specificare fino a due oggetti ChooserTarget che vengono visualizzati prima delle scorciatoie di condivisione e delle destinazioni del selettore caricate da ChooserTargetServices. Puoi anche specificare fino a due intent che rimandano ad attività elencate prima dei suggerimenti per le app:

Aggiungi Intent.EXTRA_CHOOSER_TARGETS e Intent.EXTRA_INITIAL_INTENTS all'intent di condivisione dopo aver chiamato Intent.createChooser():

val share = Intent.createChooser(shareIntent, null).apply {
    putExtra(
        Intent.EXTRA_CHOOSER_TARGETS,
        arrayOf(chooserTargetJessica, chooserTargetSpyros)
    )
    putExtra(
        Intent.EXTRA_INITIAL_INTENTS,
        arrayOf(intentTargetNearbyShare, intentTargetMaps)
    )
}

Utilizza questa funzionalità con cautela. Ogni Intent personalizzato e ChooserTarget che aggiungi riduce il numero suggerito dal sistema. In genere sconsigliamo l'aggiunta di 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 consentire l'invio di un link. Un esempio comune e appropriato di aggiunta di Intent.EXTRA_CHOOSER_TARGETS è quello di mostrare persone o dispositivi pertinenti forniti dalla tua app.

Escludere target specifici per componente

Puoi escludere target specifici fornendo Intent.EXTRA_EXCLUDE_COMPONENTS. Esegui questa operazione solo per rimuovere i target su cui hai il controllo. Un caso d'uso comune è nascondere le destinazioni di condivisione dell'app quando gli utenti condividono contenuti dall'app, poiché il loro intento è probabilmente quello di condividere al di fuori dell'app.

Aggiungi Intent.EXTRA_EXCLUDE_COMPONENTS all'intent dopo aver chiamato Intent.createChooser():

fun excludeSpecificTargets(context: Context) {
    val share = Intent.createChooser(Intent(ACTION_SEND), null).apply {
        // Only use for components you have control over
        val excludedComponentNames =
            arrayOf(ComponentName("com.example.android", "ExampleClass"))
        putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames)
    }
    context.startActivity(share)
}

Ottenere informazioni sulla condivisione

Può essere utile sapere quando gli utenti condividono contenuti e quale target selezionano. La scheda di condivisione di Android ti consente di ottenere queste informazioni fornendo l'ComponentName delle destinazioni selezionate dagli utenti utilizzando un IntentSender.

Innanzitutto, crea un PendingIntent per un BroadcastReceiver e fornisci il relativo IntentSender in Intent.createChooser():

fun infoAboutSharing(context: Context, requestCode: Int) {
    var share = Intent(ACTION_SEND)
    // ...
    val pi = PendingIntent.getBroadcast(
        context, requestCode,
        Intent(context, ShareBroadcastReceiver::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )
    share = Intent.createChooser(share, null, pi.intentSender)
    context.startActivity(share)
}

Ricevi il richiamo tra MyBroadcastReceiver e cerca in Intent.EXTRA_CHOOSER_RESULT:

override fun onReceive(context: Context?, intent: Intent) {
    val TAG = ShareBroadcastReceiver::class.simpleName
    val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra(
        intent,
        Intent.EXTRA_CHOOSER_RESULT,
        ChooserResult::class.java,
    )
    chooserResult?.let {
        Log.i(TAG,
            "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}",
        )
    } ?: Log.i(TAG, "chooserResult is null")
}
Per ulteriori informazioni, consulta l'esempio di quota di piattaforma:

Aggiungere azioni personalizzate al foglio di condivisione

Su Android 14 (livello API 34) e versioni successive, le app possono aggiungere azioni personalizzate all'Android Sharesheet. Crea un ChooserAction con ChooserAction.Builder. Puoi specificare un PendingIntent come azione richiamata quando viene fatto clic sull'icona. Crea un array contenente tutte le tue azioni personalizzate e specificalo come EXTRA_CHOOSER_CUSTOM_ACTIONS della condivisione Intent.

fun customActions(context: Context, text: String) {
    val sendIntent = 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_logo),
            "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)
}

Utilizzare il resolver di intent di Android

Screenshot del resolver di intent ACTION_SEND.

Il resolver di intent Android è ideale per inviare dati a un'altra app nell'ambito di un flusso di attività ben definito.

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

Se sono installate più applicazioni con filtri che corrispondono a ACTION_SEND e al tipo MIME, il sistema visualizza una finestra di dialogo di disambiguazione chiamata intent resolver 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 resolver di intent Android per inviare testo:

fun intentResolver(context: Context) {
    val sendIntent: Intent = Intent().apply {
        action = ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }
    context.startActivity(sendIntent)
}

Scopri di più

Per saperne di più sull'invio di dati, consulta Intent e filtri per intent.