Menerima data dari aplikasi lain

Sama seperti aplikasi yang dapat mengirim data ke aplikasi lain, aplikasi juga dapat menerima data dari aplikasi lain. Pikirkan cara pengguna berinteraksi dengan aplikasi Anda dan jenis data yang ingin Anda terima dari aplikasi lain. Misalnya, aplikasi jejaring sosial mungkin tertarik untuk menerima konten teks, seperti URL web yang menarik, dari aplikasi lain.

Dalam aplikasi yang menggunakan Compose Navigation, menerima data yang dikirim oleh aplikasi lain adalah proses tiga langkah:

  1. Deklarasikan <intent-filter> dalam manifes: Anda tetap harus menambahkan filter intent ke aktivitas Anda dalam file AndroidManifest.xml. Hal ini memberi tahu Android OS bahwa aplikasi Anda dapat menerima tindakan tertentu (seperti ACTION_SEND) dan jenis MIME (seperti text/plain).

  2. Tentukan navDeepLink dalam grafik Navigasi Compose: Lampirkan navDeepLink yang cocok dengan tindakan dan jenis MIME langsung ke tujuan composable yang akan menampilkan konten. NavController secara otomatis menangkap intent yang masuk dan mengarahkan pengguna langsung ke layar tersebut.

  3. Ekstrak payload data yang masuk: Di layar tujuan, akses tambahan intent (seperti EXTRA_TEXT atau EXTRA_STREAM) untuk mengambil konten yang dibagikan dan memperbarui status UI Anda.

Target Berbagi Langsung adalah deep link ke aktivitas tertentu dalam aplikasi Anda. Target ini sering kali mewakili seseorang atau grup, dan Android Sharesheet menampilkannya. Misalnya, aplikasi pesan dapat menyediakan target Direct Share untuk seseorang yang memiliki deep link langsung ke percakapan dengan orang tersebut. Lihat Menyediakan target Berbagi Langsung untuk petunjuk mendetail.

Mendukung jenis MIME

Idealnya, aplikasi harus dapat menerima berbagai jenis MIME seluas mungkin. Misalnya, aplikasi pesan yang dirancang untuk mengirim teks, gambar, dan video idealnya mendukung penerimaan text/*, image/*, dan video/*. Berikut beberapa jenis MIME umum untuk mengirim dan menerima data di Android.

Penerima mendaftar untuk Pengirim mengirim
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Ekstensi file yang didukung application/pdf

Lihat registry resmi IANA untuk jenis media MIME.

Membuat target berbagi yang bagus

Saat pengguna mengetuk target berbagi yang terkait dengan aktivitas tertentu, izinkan mereka mengonfirmasi dan mengedit konten yang dibagikan sebelum aplikasi Anda menggunakannya. Hal ini sangat penting untuk data teks.

Menerima data di aplikasi Anda

Menerima data yang dibagikan di aplikasi menggunakan Compose melibatkan pendeklarasian filter intent dalam manifes, perutean intent masuk ke layar yang tepat dengan deep link, dan ekstraksi payload dari intent untuk mengupdate UI Anda.

Mengupdate manifes Anda

Filter intent memberi tahu sistem intent mana yang diterima komponen aplikasi. Mirip dengan cara Anda membuat intent dengan tindakan ACTION_SEND dalam pelajaran Mengirim data ke aplikasi lain, Anda membuat filter intent untuk menerima intent dengan tindakan ini. Anda menentukan filter intent dalam manifes menggunakan elemen <intent-filter>. Misalnya, jika aplikasi Anda menangani penerimaan konten teks, manifes yang menyertakan satu atau beberapa gambar dari jenis apa pun akan terlihat seperti cuplikan berikut:

<activity android:name=".ui.MyActivity" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

Saat aplikasi lain mencoba membagikan salah satu hal ini dengan membuat intent dan meneruskannya ke startActivity(), aplikasi Anda akan dicantumkan sebagai opsi di Android Sharesheet atau intent resolver. Jika pengguna memilih aplikasi Anda, tindakan ini akan memulai aktivitas yang sesuai (.ui.MyActivity dalam contoh sebelumnya). Kemudian, Anda harus menangani konten dengan tepat dalam kode dan UI Anda.

Di Compose Navigation, lampirkan navDeepLink langsung ke tujuan composable yang akan menampilkan konten. Saat aplikasi lain membagikan data yang cocok dengan filter intent Anda, Navigation Compose akan mengarahkan pengguna langsung ke tujuan ini:

navDeepLink mencocokkan tindakan dan jenis MIME intent yang masuk untuk membuka layar tujuan yang benar. Setelah berada di tujuan tersebut, pengendali Anda akan memeriksa intent untuk menentukan payload mana yang diterima (seperti satu gambar versus beberapa gambar) dan mengekstrak tambahan yang sesuai.

Menangani konten yang masuk

Untuk mengambil konten yang dikirimkan oleh Intent, baca aktivitas saat ini dari LocalActivity.current dalam composable Anda, lalu periksa intent untuk menentukan tindakan selanjutnya. Jika aktivitas ini dapat dimulai dari bagian lain sistem (seperti peluncur), pertimbangkan hal ini saat memeriksa intent.

Berhati-hatilah dalam memeriksa data yang masuk: jenis MIME yang salah mungkin ditetapkan, atau gambar yang dikirim mungkin sangat besar. Proses data biner atau operasi I/O yang berat (seperti mendekode gambar besar atau menulis file) secara asinkron menggunakan coroutine (seperti Dispatchers.IO), bukan di UI thread utama.

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }

        Intent.ACTION_SEND_MULTIPLE -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendMultipleImages(intent) // Handle multiple images being sent
            }
        }

        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

Saat mengekstrak data biner atau URI dari tambahan intent (seperti EXTRA_STREAM), gunakan IntentCompat.getParcelableExtra() atau IntentCompat.getParcelableArrayListExtra() dari library AndroidX Core, seperti yang ditunjukkan dalam fungsi handleSendImage dan handleSendMultipleImages sebelumnya. Android 13 (level API 33) menghentikan penggunaan metode Intent.getParcelableExtra(String) tanpa parameter dan menggantinya dengan metode yang aman dari jenis yang menggunakan jenis class yang diharapkan.

Memperbarui UI setelah menerima data dapat dilakukan dengan mudah, seperti memperbarui status untuk mengisi TextField, atau serumit menerapkan filter ke gambar. Tindakan selanjutnya bergantung pada aplikasi Anda.

Berbagi URL screenshot

Saat mengambil screenshot, Anda dapat membagikan screenshot dan URL terkait. Hal ini memberikan pengalaman pengguna yang lebih kaya. Saat menerima URL, pastikan untuk mendapatkan kolom EXTRA_TEXT dari intent, seperti yang ditunjukkan dalam contoh berikut:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI state with the shared image and the EXTRA_TEXT if available
}

Memastikan pengguna mengenali aplikasi Anda

Aplikasi Anda diwakili oleh ikon dan label di Android Sharesheet dan resolver intent. Keduanya ditentukan dalam manifes. Anda dapat menetapkan label filter intent atau aktivitas untuk memberikan lebih banyak konteks.

Mulai Android 10 (level API 29), Sheet Berbagi Android hanya menggunakan ikon yang ditetapkan dalam manifes pada tag application Anda. Android mengabaikan ikon yang ditetapkan pada tag intent-filter dan activity.

Menerima konten lengkap

Meskipun intent ACTION_SEND memungkinkan penerimaan data dari Android Sharesheet dan intent resolver di tingkat Activity atau Navigation, aplikasi juga dapat menerima konten lengkap (seperti gambar, video, file audio, dan teks bergaya) melalui interaksi UI langsung. Mekanisme ini mencakup:

  • Menempelkan dari papan klip (menu sentuh lama)
  • Menyisipkan media langsung dari keyboard virtual (IME), seperti stiker atau GIF
  • Menarik lalu melepas konten dari aplikasi lain dalam mode multi-aplikasi atau layar terpisah

Di UI berbasis View, Android 12 (level API 31) dan AndroidX Core 1.7 memperkenalkan API OnReceiveContentListener terpadu. Pemroses ini menggabungkan penanganan konten dari papan klip, keyboard, dan tarik lalu lepas ke dalam satu callback. Untuk mengetahui petunjuk mendetail tentang cara menerapkan hal ini di View, lihat Menerima konten lengkap.

Di Jetpack Compose, Anda dapat menangani penerimaan konten lengkap yang disisipkan ke dalam komponen UI (seperti kolom teks) menggunakan pengubah Modifier.contentReceiver atau pengubah tarik lalu lepas.