Android menyediakan dua cara bagi pengguna untuk berbagi data antar-aplikasi:
- Android Sharesheet terutama dirancang untuk mengirim konten di luar aplikasi Anda atau langsung ke pengguna lain. Misalnya, berbagi URL dengan teman.
- Intent resolver Android paling cocok untuk meneruskan data ke tahap berikutnya dari tugas yang jelas. Misalnya, membuka PDF dari aplikasi Anda dan mengizinkan pengguna memilih penampil pilihan mereka.
Alasan menggunakan Android Sharesheet
Gunakan Android Sharesheet untuk membuat konsistensi bagi pengguna di seluruh aplikasi. Jangan tampilkan daftar target berbagi aplikasi Anda sendiri atau buat variasi Sharesheet Anda sendiri.
Android Sharesheet memungkinkan pengguna berbagi informasi dengan orang yang tepat, dengan saran aplikasi yang relevan, semuanya dengan satu ketukan. Sharesheet dapat menyarankan target yang tidak tersedia untuk solusi kustom dan menggunakan peringkat yang konsisten. Hal ini karena Sharesheet dapat mempertimbangkan 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 teks lengkap, 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.
Tindakan ini akan 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 aktivitas ke aktivitas 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 dituju oleh Uri. Ada dua cara yang direkomendasikan untuk melakukannya:
- Simpan data di
ContentProviderAnda sendiri, pastikan aplikasi lain memiliki izin yang benar untuk mengakses penyedia Anda. Mekanisme pilihan untuk memberikan akses adalah menggunakan izin per-URI, yang bersifat sementara dan hanya memberikan akses ke aplikasi penerima. Untuk membuatContentProviderseperti ini, gunakan class helperFileProvider. - Gunakan
MediaStoresistem.MediaStoreterutama untuk jenis MIME video, audio, dan gambar. Namun, mulai Android 3.0 (level API 11), aplikasi ini juga dapat menyimpan jenis non-media. Untuk mengetahui informasi selengkapnya, lihatMediaStore.Files. File dapat disisipkan keMediaStoremenggunakanscanFile(), setelah ituUrigayacontent://yang cocok untuk berbagi 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 paling spesifik yang tersedia untuk data yang Anda kirim. Misalnya, gunakan text/plain saat berbagi 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 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 bagian konten
Untuk membagikan beberapa bagian konten, gunakan tindakan ACTION_SEND_MULTIPLE bersama dengan daftar URI yang mengarah ke konten. Jenis MIME bervariasi sesuai dengan campuran konten yang Anda bagikan. Misalnya, jika Anda membagikan tiga gambar JPEG, gunakan jenis "image/jpg". Untuk campuran jenis gambar, gunakan "image/*" agar cocok dengan aktivitas yang menangani jenis gambar apa pun. Meskipun Anda dapat membagikan campuran jenis, sebaiknya hindari melakukannya, karena penerima tidak mengetahui apa yang akan dikirim. Jika Anda perlu mengirim beberapa jenis, gunakan "*/*". Aplikasi penerima yang 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 Anda 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 Membagikan file. Pastikan Anda memberikan izin yang tepat kepada Sharesheet 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) }
Pratinjau akan terlihat seperti ini:
Menambahkan tindakan kustom ke sharesheet
Di Android 14 (level API 34) dan yang lebih baru, 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 a
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 dari 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 sebagai gantinya
(lihat Memberikan target Berbagi Langsung):
Tambahkan Intent.EXTRA_INITIAL_INTENTS ke Intent berbagi 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 sesuai untuk menambahkan Intent.EXTRA_INITIAL_INTENTS adalah menyediakan tindakan tambahan yang dapat dilakukan pengguna pada konten yang dibagikan. Misalnya, pengguna membagikan gambar dan Intent.EXTRA_INITIAL_INTENTS digunakan untuk mengizinkan mereka mengirim link.
Mengecualikan target tertentu berdasarkan komponen
Anda dapat mengecualikan target tertentu dengan memberikan Intent.EXTRA_EXCLUDE_COMPONENTS.
Lakukan hal ini hanya untuk menghapus target yang dapat Anda kontrol. Kasus penggunaan umum adalah menyembunyikan target berbagi aplikasi Anda saat pengguna membagikan dari dalam aplikasi Anda, karena kemungkinan intent mereka adalah berbagi di luar aplikasi Anda.
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
Sebaiknya ketahui kapan pengguna Anda berbagi dan target apa yang mereka pilih. Android Sharesheet memungkinkan Anda mendapatkan informasi ini dengan memberikan ComponentName target yang dipilih pengguna menggunakan IntentSender.
Pertama, buat PendingIntent untuk BroadcastReceiver dan berikan IntentSender 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 Android paling tepat digunakan saat mengirim data ke aplikasi lain sebagai bagian dari alur tugas yang jelas.
Untuk menggunakan intent resolver Android, 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 dibagikan. Jika satu aplikasi cocok, aplikasi tersebut akan berjalan.
Berikut contoh cara menggunakan intent resolver Android 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 pengiriman data, lihat Intent dan Filter Intent.