Menerima data dari aplikasi lain

Sama seperti aplikasi yang dapat mengirim data ke aplikasi lain, aplikasi juga dapat menerima data dari aplikasi lain. Pikirkan bagaimana pengguna berinteraksi dengan aplikasi Anda dan jenis data apa 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.

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

  1. Deklarasikan an <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 Compose Navigation Anda: Lampirkan navDeepLink yang cocok dengan tindakan dan jenis MIME langsung ke tujuan composable yang harus menampilkan konten. NavController secara otomatis mencegat intent yang masuk dan mengarahkan pengguna langsung ke layar tersebut.

  3. Ekstrak payload data yang masuk: Di layar tujuan, akses intent tambahan (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 Berbagi Langsung untuk seseorang yang deep link-nya langsung ke percakapan dengan orang tersebut. Lihat Menyediakan target Berbagi Langsung untuk mengetahui petunjuk mendetail.

Mendukung jenis MIME

Idealnya, aplikasi harus dapat menerima rentang 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 jenis media MIME IANA.

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 deklarasi filter intent dalam manifes Anda, merutekan intent yang masuk ke layar yang tepat dengan deep link, dan mengekstrak payload dari intent untuk memperbarui 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 tercantum sebagai opsi di Android Sharesheet atau pemroses intent. Jika pengguna memilih aplikasi Anda, hal 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 harus menampilkan konten. Saat aplikasi lain membagikan data yang cocok dengan filter intent Anda, Compose Navigation akan mengarahkan pengguna langsung ke tujuan ini:

navDeepLink cocok dengan 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 Pengiriman Konten yang dikirimkan oleh Intent, baca Activity saat ini dari LocalActivity.current dalam composable Anda, lalu periksa intent untuk menentukan tindakan selanjutnya. Jika aktivitas ini dapat dimulai dari bagian sistem lainnya (seperti peluncur), pertimbangkan hal ini saat memeriksa intent.

Berhati-hatilah saat 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 intent tambahan (seperti EXTRA_STREAM), gunakan IntentCompat.getParcelableExtra() atau IntentCompat.getParcelableArrayListExtra() dari library AndroidX Core, seperti yang ditunjukkan dalam fungsi handleSendImage dan handleSendMultipleImages sebelumnya. Android 13 (API level 33) menghentikan penggunaan metode Intent.getParcelableExtra(String) yang tidak memiliki parameter dan menggantinya dengan metode yang aman untuk 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. Terserah aplikasi Anda apa yang akan terjadi selanjutnya.

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 labelnya di Android Sharesheet dan pemroses intent. Keduanya ditentukan dalam manifes. Anda dapat menetapkan label filter intent atau aktivitas untuk memberikan konteks yang lebih banyak.

Mulai Android 10 (level API 29), Android Sharesheet 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 pemroses intent di tingkat aktivitas atau navigasi, aplikasi juga dapat menerima konten lengkap (seperti gambar, video, file audio, dan teks bergaya) melalui interaksi UI langsung. Mekanisme ini mencakup:

  • Menempel dari papan klip (menu sentuh &tahan)
  • 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 (API level 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 mengimplementasikan 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.