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:
Deklarasikan
<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 Navigasi Compose: LampirkannavDeepLinkyang cocok dengan tindakan dan jenis MIME langsung ke tujuan composable yang akan menampilkan konten.NavControllersecara otomatis menangkap intent yang masuk dan mengarahkan pengguna langsung ke layar tersebut.Ekstrak payload data yang masuk: Di layar tujuan, akses tambahan intent (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 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/* |
|
image/* |
|
video/* |
|
| 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.
Menentukan deep link di grafik navigasi
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:
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 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.