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:
Deklarasikan an
<intent-filter>dalam manifes: Anda tetap harus menambahkan filter intent ke aktivitas Anda dalam fileAndroidManifest.xml. Hal ini memberi tahu Android OS bahwa aplikasi Anda dapat menerima tindakan tertentu (sepertiACTION_SEND) dan jenis MIME (sepertitext/plain).Tentukan
navDeepLinkdalam grafik Compose Navigation Anda: LampirkannavDeepLinkyang cocok dengan tindakan dan jenis MIME langsung ke tujuan composable yang harus menampilkan konten.NavControllersecara otomatis mencegat intent yang masuk dan mengarahkan pengguna langsung ke layar tersebut.Ekstrak payload data yang masuk: Di layar tujuan, akses intent tambahan (seperti
EXTRA_TEXTatauEXTRA_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/* |
|
image/* |
|
video/* |
|
| 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.
Menentukan deep link dalam grafik navigasi 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:
composable( route = "incoming_share", deepLinks = listOf( navDeepLink { action = Intent.ACTION_SEND mimeType = "text/plain" }, navDeepLink { action = Intent.ACTION_SEND mimeType = "image/*" }, navDeepLink { action = Intent.ACTION_SEND_MULTIPLE mimeType = "image/*" } ) ) { SharesheetHandler() }
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.