Seperti halnya aplikasi dapat mengirim data ke aplikasi lain, aplikasi juga dapat menerima data dari aplikasi juga. Pikirkan tentang bagaimana pengguna berinteraksi dengan aplikasi Anda dan data apa yang ingin Anda terima dari aplikasi lain. Misalnya, aplikasi jaringan mungkin tertarik untuk menerima isi teks, seperti URL web yang menarik, dari aplikasi lain.
Pengguna aplikasi lain sering mengirim data ke aplikasi Anda melalui Android Sharesheet atau intent resolver. Aplikasi yang mengirim data ke aplikasi Anda harus menyetel Jenis MIME untuk data tersebut. Aplikasi Anda dapat menerima data yang dikirim oleh aplikasi lain dengan cara berikut:
Activity
dengan tagintent-filter
yang cocok di manifes- Sharing Shortcut yang dipublikasikan oleh aplikasi Anda.
Target Berbagi Langsung adalah deep link ke Aktivitas tertentu dalam aplikasi Anda. Keduanya sering mewakili seseorang atau grup, dan Android Sharesheet menunjukkannya. Misalnya, aplikasi pesan dapat menyediakan target Berbagi Langsung untuk orang yang membuat deep link dalam percakapan dengan orang tersebut secara langsung. Lihat Menyediakan target Berbagi Langsung untuk detail petunjuk.
Mendukung jenis MIME
Idealnya, aplikasi harus dapat menerima rentang jenis MIME seluas mungkin.
Misalnya, aplikasi pesan yang didesain untuk mengirim teks, gambar, dan video
idealnya mendukung penerimaan text/*
, image/*
, dan video/*
. Berikut beberapa
jenis MIME umum untuk mengirim dan menerima data sederhana di Android.
Penerima mendaftar untuk | Pengirim mengirim |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Ekstensi file yang didukung | application/pdf |
Lihat registry resmi IANA untuk jenis media MIME.
Buat target berbagi yang bagus
Saat pengguna mengetuk target berbagi yang terkait dengan aktivitas tertentu yang mereka harus bisa mengonfirmasi dan mengedit konten yang dibagikan sebelum menggunakannya. Hal ini sangat penting untuk data teks.
Menerima data dengan aktivitas
Menerima data dengan aktivitas melibatkan pembaruan manifes, menangani konten yang masuk, dan memastikan bahwa pengguna mengenali aplikasi 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
di bagian
Mengirim data sederhana ke aplikasi lain
Anda akan membuat filter intent untuk menerima intent dengan tindakan ini. Anda
tentukan filter intent dalam manifes Anda menggunakan elemen <intent-filter>
.
Misalnya, jika aplikasi Anda menangani penerimaan konten teks, manifes yang
menyertakan satu atau beberapa gambar dengan jenis apa pun akan terlihat seperti cuplikan berikut:
<activity android:name=".ui.MyActivity" > <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 dari hal ini dengan membuat
dan meneruskannya ke startActivity()
, aplikasi Anda
tercantum sebagai opsi dalam Android Sharesheet atau intent resolver. Jika pengguna
memilih aplikasi Anda, tindakan ini akan memulai aktivitas yang sesuai (.ui.MyActivity
dalam
contoh sebelumnya). Terserah Anda untuk menangani konten tersebut dengan tepat
dalam kode dan UI Anda.
Menangani konten yang masuk
Untuk menangani konten yang ditayangkan oleh Intent
, panggil
getIntent()
untuk mendapatkan objek Intent
. Setelah Anda memiliki objeknya,
Anda dapat memeriksa isinya untuk
menentukan apa yang harus dilakukan selanjutnya. Jika aktivitas ini dapat
dimulai dari bagian lain dari sistem (seperti peluncur), lakukan
menjadi pertimbangan saat memeriksa niat.
Harap berhati-hati untuk memeriksa data yang masuk, Anda tidak akan pernah tahu apa yang aplikasi mungkin kirimkan kepada Anda. Misalnya, jenis MIME yang ditetapkan mungkin salah, atau gambar yang dikirim mungkin sangat besar. Juga, ingatlah untuk memproses data biner di thread terpisah, bukan di thread utama ("UI").
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && 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 to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
Mengupdate UI setelah menerima data dapat sesederhana mengisi
EditText
, atau bisa lebih
rumit seperti menerapkan filter foto yang menarik ke sebuah gambar. Terserah
aplikasi Anda apa yang terjadi selanjutnya.
Memastikan pengguna mengenali aplikasi Anda
Aplikasi Anda diwakili oleh ikon dan label di Android Sharesheet dan intent resolver. Keduanya didefinisikan dalam manifes. Anda dapat menetapkan label filter aktivitas atau intent untuk memberikan lebih banyak konteks.
Mulai Android 10 (API level 29), Android Sharesheet hanya menggunakan ikon yang disetel di
manifes di tag application
Anda. Android mengabaikan ikon yang disetel
Tag intent-filter
dan activity
.