Android menyediakan dua cara bagi pengguna untuk berbagi data antar-aplikasi:
- Android Sharesheet terutama dirancang untuk mengirim konten ke luar aplikasi Anda atau langsung ke pengguna lain. Misalnya, berbagi URL dengan teman.
- Resolver intent Android paling cocok untuk meneruskan data ke tahap berikutnya dari tugas yang ditentukan dengan baik. Misalnya, membuka PDF dari aplikasi Anda dan mengizinkan pengguna memilih penampil yang mereka inginkan.
Alasan menggunakan Android Sharesheet
Gunakan Android Sharesheet untuk menciptakan konsistensi bagi pengguna di seluruh aplikasi. Jangan menampilkan daftar target berbagi aplikasi Anda sendiri atau membuat variasi Sharesheet Anda sendiri.
Android Sharesheet memungkinkan pengguna berbagi informasi dengan orang yang tepat, dengan saran aplikasi yang relevan, semuanya dengan sekali ketuk. Sharesheet dapat menyarankan target yang tidak tersedia untuk solusi kustom dan menggunakan peringkat yang konsisten. Hal ini karena Sharesheet dapat memperhitungkan informasi tentang aktivitas aplikasi dan pengguna yang hanya tersedia untuk sistem.
Android Sharesheet juga memiliki banyak fitur yang berguna bagi developer. Misalnya, Anda dapat melakukan hal berikut:
- Mencari tahu kapan pengguna Anda menyelesaikan berbagi dan kepada siapa dibagikan
- Menambahkan target kustom dan target aplikasi
- Menyediakan pratinjau konten rich text, mulai Android 10 (level API 29)
- Mengecualikan target yang cocok dengan nama komponen tertentu
Menggunakan Android Sharesheet
Untuk semua jenis berbagi, buat intent dan tetapkan tindakannya ke
Intent.ACTION_SEND.
Untuk menampilkan Android Sharesheet, panggil
Intent.createChooser(),
dengan meneruskan objek Intent Anda.
Metode ini menampilkan versi intent Anda yang selalu menampilkan Android Sharesheet.
Mengirim konten teks
Penggunaan Android Sharesheet yang paling mudah dan umum adalah mengirim konten teks dari satu Activity ke Activity lainnya. Misalnya, sebagian besar browser dapat membagikan URL halaman yang saat ini ditampilkan
sebagai teks dengan aplikasi lain. Hal ini berguna untuk membagikan artikel atau situs kepada teman melalui
email atau jejaring sosial. Di Jetpack Compose, ambil konteks saat ini menggunakan
LocalContext.current dan panggil context.startActivity().
Berikut ini contoh cara melakukannya:
fun shareText(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) context.startActivity(shareIntent) }
Secara opsional, Anda dapat menambahkan tambahan untuk menyertakan informasi selengkapnya, seperti penerima email
(EXTRA_EMAIL,
EXTRA_CC,
EXTRA_BCC),
atau subjek email
(EXTRA_SUBJECT).
Catatan: Beberapa aplikasi email, seperti Gmail, mengharapkan
String[] untuk tambahan seperti
EXTRA_EMAIL dan EXTRA_CC. Gunakan
putExtra(String, String[])
untuk menambahkannya ke intent Anda.
Mengirim konten biner
Bagikan data biner menggunakan tindakan ACTION_SEND.
Tetapkan jenis MIME yang sesuai dan tempatkan URI ke data dalam tambahan
EXTRA_STREAM, seperti
yang ditunjukkan dalam contoh berikut.
Hal ini umum digunakan untuk membagikan gambar, tetapi dapat digunakan untuk membagikan jenis konten biner apa pun.
fun shareBinaryContent(context: Context) { val shareIntent: Intent = Intent().apply { action = ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... val imageUri: Uri = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1") putExtra(Intent.EXTRA_STREAM, imageUri) type = "image/jpeg" } context.startActivity(Intent.createChooser(shareIntent, null)) }
Aplikasi penerima memerlukan izin untuk mengakses data yang ditunjuk oleh Uri. Ada dua cara yang direkomendasikan untuk melakukannya:
- Simpan data di
ContentProviderAnda sendiri, dan pastikan aplikasi lain memiliki izin yang benar untuk mengakses penyedia Anda. Mekanisme yang lebih disukai untuk memberikan akses adalah menggunakan izin per URI, yang bersifat sementara dan hanya memberikan akses ke aplikasi penerima. Untuk membuatContentProviderseperti ini, gunakan class bantuanFileProvider. - Gunakan
MediaStoresistem.MediaStoreterutama ditujukan untuk jenis MIME video, audio, dan gambar. Namun, mulai Android 3.0 (API level 11), penyedia ini juga dapat menyimpan jenis non-media. Untuk mengetahui informasi selengkapnya, lihatMediaStore.Files. File dapat disisipkan ke dalamMediaStoremenggunakanscanFile(), setelah ituUribergayacontent://yang cocok untuk dibagikan akan diteruskan ke callbackonScanCompleted()yang disediakan. Perhatikan bahwa setelah ditambahkan keMediaStoresistem, konten dapat diakses oleh aplikasi apa pun di perangkat.
Menggunakan jenis MIME yang tepat
Berikan jenis MIME yang paling spesifik yang tersedia untuk data yang Anda
kirim. Misalnya, gunakan text/plain saat membagikan teks biasa. Berikut beberapa
jenis MIME umum saat mengirim data di Android:
| Penerima mendaftar untuk | Pengirim mengirim |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Ekstensi file yang didukung | application/pdf |
Untuk menentukan jenis MIME secara dinamis saat runtime, bukan melakukan hardcode, gunakan metode berikut:
- Untuk URI
content://(seperti yang disediakan olehFileProvideratauMediaStore), panggilContentResolver.getType(). - Untuk ekstensi file, panggil
MimeTypeMap.getSingleton().getMimeTypeFromExtension(). - Jika menggunakan Storage Access Framework, Anda juga dapat membuat kueri
DocumentFile.getType().
Jika Anda tidak dapat menentukan jenis MIME tertentu, gunakan application/octet-stream untuk data biner generik, atau */* sebagai upaya terakhir.
Untuk mengetahui informasi selengkapnya tentang jenis MIME, lihat registry resmi jenis media MIME IANA.
Android Sharesheet mungkin menampilkan pratinjau konten, bergantung pada jenis MIME yang disediakan. Beberapa fitur pratinjau hanya tersedia untuk jenis tertentu.
Membagikan beberapa konten
Untuk membagikan beberapa konten, gunakan tindakan ACTION_SEND_MULTIPLE
bersama dengan daftar URI yang mengarah ke konten tersebut. Jenis MIME bervariasi sesuai dengan
kombinasi konten yang Anda bagikan. Misalnya, jika Anda membagikan tiga gambar JPEG, gunakan jenis
"image/jpg". Untuk campuran jenis gambar, gunakan "image/*" untuk mencocokkan
aktivitas yang menangani jenis gambar apa pun. Meskipun Anda dapat membagikan campuran jenis, hindari
melakukan hal ini, karena
penerima tidak akan tahu apa yang ingin dikirim. Jika perlu mengirim beberapa jenis, gunakan
"*/*". Aplikasi penerima akan mengurai
dan memproses data Anda. Berikut contohnya:
fun shareMultiple(context: Context) { val imageUris: ArrayList<Uri> = arrayListOf( Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"), Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2") ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } context.startActivity(Intent.createChooser(shareIntent, null)) }
Pastikan objek Uri yang disediakan mengarah
ke data yang dapat diakses oleh aplikasi penerima.
Menambahkan konten lengkap ke pratinjau teks
Mulai Android 10 (level API 29), Android Sharesheet menampilkan pratinjau teks yang dibagikan. Dalam beberapa kasus, teks yang dibagikan bisa sulit dipahami. Pertimbangkan untuk membagikan
URL yang rumit seperti https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Pratinjau yang lebih lengkap
dapat meyakinkan pengguna tentang apa yang dibagikan.
Jika melihat pratinjau teks, Anda dapat menetapkan judul, gambar thumbnail, atau keduanya. Tambahkan deskripsi ke
Intent.EXTRA_TITLE sebelum memanggil Intent.createChooser(), dan tambahkan
thumbnail yang relevan menggunakan ClipData.
Catatan: URI konten gambar disediakan dari
FileProvider, biasanya dari <cache-path> yang dikonfigurasi.
Untuk mengetahui informasi selengkapnya, lihat Berbagi file. Pastikan untuk memberi
Sharesheet izin yang tepat untuk membaca gambar apa pun yang ingin Anda gunakan sebagai thumbnail. Untuk mengetahui informasi selengkapnya,
lihat Intent.FLAG_GRANT_READ_URI_PERMISSION.
Berikut contohnya:
fun richContentToTextPreviewShares(context: Context) { val share = Intent.createChooser( Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789") flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null ) context.startActivity(share) }
Pratinjaunya terlihat seperti ini:
Menambahkan tindakan kustom ke sharesheet
Di Android 14 (level API 34) dan yang lebih tinggi, aplikasi dapat menambahkan tindakan kustom ke Android Sharesheet.
Tindakan kustom ditampilkan sebagai ikon tindakan kecil di bagian atas Android Sharesheet, dan aplikasi dapat menentukan Intent apa pun sebagai tindakan yang dipanggil saat ikon diklik.
Untuk menambahkan tindakan kustom di Android Sharesheet, pertama-tama buat
ChooserAction dengan ChooserAction.Builder.
Anda dapat menentukan PendingIntent sebagai tindakan yang dipanggil saat ikon diklik. Buat array yang berisi semua tindakan kustom Anda dan tentukan sebagai
EXTRA_CHOOSER_CUSTOM_ACTIONS
Intent berbagi.
fun sharesheetCustomActions(context: Context, previewText: String) { val sendIntent = Intent(ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, previewText) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_logo), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent) }
Menambahkan target kustom
Android Sharesheet memungkinkan Anda menentukan hingga dua intent aktivitas kustom
yang tercantum sebelum saran aplikasi menggunakan Intent.EXTRA_INITIAL_INTENTS.
Untuk target Berbagi Langsung (seperti percakapan atau kontak), publikasikan pintasan dinamis menggunakan
ShortcutManagerCompat
(lihat Memberikan target Berbagi Langsung):
Tambahkan Intent.EXTRA_INITIAL_INTENTS ke
Intent berbagi Anda setelah memanggil
Intent.createChooser():
val sendIntent = Intent(ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_TEXT, previewText) } val customIntent = Intent().apply { component = ComponentName(context.packageName, "${context.packageName}.CustomActivity") } val shareIntent = Intent.createChooser(sendIntent, null).apply { putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(customIntent) ) } context.startActivity(shareIntent)
Gunakan fitur ini secara cermat. Setiap Intent kustom
yang Anda tambahkan akan mengurangi jumlah yang disarankan sistem. Secara umum, hindari
menambahkan target kustom. Contoh umum yang tepat untuk menambahkan
Intent.EXTRA_INITIAL_INTENTS adalah memberikan tindakan tambahan yang dapat dilakukan pengguna pada konten
yang dibagikan. Misalnya, pengguna membagikan gambar dan Intent.EXTRA_INITIAL_INTENTS digunakan untuk
memungkinkan mereka mengirim link.
Mengecualikan target tertentu menurut komponen
Anda dapat mengecualikan target tertentu dengan memberikan Intent.EXTRA_EXCLUDE_COMPONENTS.
Hanya lakukan ini untuk menghapus target yang Anda kontrol. Kasus penggunaan yang umum adalah menyembunyikan
target berbagi aplikasi saat pengguna berbagi dari dalam aplikasi, karena niat mereka kemungkinan adalah berbagi
ke luar aplikasi.
Tambahkan Intent.EXTRA_EXCLUDE_COMPONENTS ke intent Anda setelah memanggil Intent.createChooser():
fun excludeSpecificTargets(context: Context) { val share = Intent.createChooser(Intent(ACTION_SEND), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) } context.startActivity(share) }
Mendapatkan informasi tentang berbagi
Mengetahui kapan pengguna Anda berbagi dan target apa yang mereka pilih dapat berguna. Android Sharesheet memungkinkan Anda mendapatkan informasi ini dengan memberikan ComponentName target yang dipilih pengguna menggunakan IntentSender.
Pertama, buat PendingIntent untuk BroadcastReceiver dan berikan
IntentSender-nya di Intent.createChooser():
fun infoAboutSharing(context: Context, requestCode: Int) { var share = Intent(ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( context, requestCode, Intent(context, ShareBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender) context.startActivity(share) }
Terima callback di MyBroadcastReceiver dan lihat di
Intent.EXTRA_CHOOSER_RESULT:
override fun onReceive(context: Context?, intent: Intent) { val TAG = ShareBroadcastReceiver::class.simpleName val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra( intent, Intent.EXTRA_CHOOSER_RESULT, ChooserResult::class.java, ) chooserResult?.let { Log.i(TAG, "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}", ) } ?: Log.i(TAG, "chooserResult is null") }
Untuk mengetahui informasi selengkapnya, lihat contoh berbagi platform.
Menggunakan intent resolver Android
ACTION_SEND intent resolver.Intent resolver Android paling tepat digunakan saat mengirim data ke aplikasi lain sebagai bagian dari alur tugas yang jelas.
Untuk menggunakan Android intent resolver, buat intent dan tambahkan tambahan seperti yang Anda lakukan untuk memanggil
Android Sharesheet. Namun, jangan panggil
Intent.createChooser().
Jika ada beberapa aplikasi terinstal dengan filter yang cocok dengan
ACTION_SEND
dan jenis MIME, sistem akan menampilkan dialog disambiguasi yang disebut intent resolver
yang memungkinkan pengguna memilih target untuk berbagi. Jika satu aplikasi cocok, aplikasi tersebut akan dijalankan.
Berikut adalah contoh cara menggunakan Android intent resolver untuk mengirim teks:
fun intentResolver(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } context.startActivity(sendIntent) }
Pelajari lebih lanjut
Untuk mengetahui informasi selengkapnya tentang cara mengirim data, lihat Intent dan Filter Intent.