Android menggunakan intent dan tambahan terkait guna memungkinkan pengguna berbagi informasi secara cepat dan mudah menggunakan aplikasi favoritnya.
Android menyediakan dua cara bagi pengguna untuk berbagi data antar-aplikasi:
- Android Sharesheet utamanya didesain untuk mengirim konten di luar aplikasi dan/atau langsung ke pengguna lain. Misalnya, berbagi URL dengan teman.
- Intent resolver Android paling cocok untuk meneruskan data ke tahap tugas yang jelas berikutnya. Misalnya, membuka PDF dari aplikasi Anda dan memungkinkan pengguna memilih penampil pilihannya.
Saat membuat intent, Anda menentukan tindakan yang Anda inginkan untuk dilakukan intent.
Android menggunakan tindakan ACTION_SEND
untuk mengirim data dari satu aktivitas ke aktivitas lainnya,
bahkan di seluruh batas proses. Anda perlu menentukan
data dan jenisnya. Sistem ini otomatis mengidentifikasi aktivitas yang kompatibel
yang dapat menerima data dan menampilkannya kepada pengguna. Dalam kasus intent resolver,
jika hanya ada satu aktivitas yang dapat menangani intent, aktivitas tersebut akan langsung dimulai.
Alasan menggunakan Android Sharesheet
Kami sangat merekomendasikan penggunaan Android Sharesheet untuk menciptakan konsistensi bagi pengguna di seluruh aplikasi Anda. 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 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
ChooserTarget
kustom dan target aplikasi - Menyediakan pratinjau konten rich text, mulai dari Android 10 (API level 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 menampilkan versi intent Anda yang selalu menampilkan Android Sharesheet.
Mengirim konten teks
Penggunaan Android Sharesheet yang paling sederhana dan umum adalah mengirim konten teks dari satu aktivitas ke aktivitas lain. Misalnya, sebagian besar browser dapat membagikan URL halaman yang sedang ditampilkan sebagai teks ke aplikasi lain. Hal ini berguna untuk membagikan artikel atau situs kepada teman melalui email atau jaringan sosial. Berikut ini contoh cara melakukannya:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
Secara opsional, Anda dapat menambahkan tambahan untuk menyertakan informasi lainnya, seperti penerima email
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
subjek email
(EXTRA_SUBJECT
), dll.
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 EXTRA_STREAM
tambahan, seperti yang ditunjukkan dalam contoh berikut.
Umumnya ini digunakan untuk membagikan gambar, tetapi bisa untuk membagikan semua jenis konten biner.
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
Aplikasi penerima memerlukan izin untuk mengakses data yang dituju
Uri
. Ada dua cara yang direkomendasikan untuk melakukannya:
- Simpan data di
ContentProvider
Anda sendiri, dengan memastikan aplikasi lain memiliki izin yang tepat untuk mengakses penyedia Anda. Mekanisme yang lebih disukai untuk menyediakan akses adalah menggunakan izin per URI, yang bersifat sementara dan hanya memberikan akses ke aplikasi penerima. Cara mudah untuk membuatContentProvider
seperti ini adalah dengan menggunakan class helperFileProvider
. - Gunakan
MediaStore
sistem.MediaStore
utamanya untuk jenis MIME video, audio, dan gambar. Namun, mulai Android 3.0 (level API 11), Android 3.0 juga dapat menyimpan jenis non-media. Untuk informasi selengkapnya, lihatMediaStore.Files
. File dapat dimasukkan keMediaStore
menggunakanscanFile()
, setelah ituUri
bergayacontent://
yang cocok untuk berbagi diteruskan ke callbackonScanCompleted()
yang disediakan. Perhatikan bahwa setelah ditambahkan keMediaStore
sistem, 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 ini beberapa jenis MIME umum saat mengirim data sederhana di Android:
Penerima mendaftar untuk | Pengirim mengirim |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Ekstensi file yang didukung | application/pdf |
Untuk informasi selengkapnya tentang jenis MIME, lihat registry resmi IANA untuk jenis media MIME.
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 tersebut. Jenis MIME bervariasi sesuai dengan
campuran konten yang Anda bagikan. Misalnya, jika Anda membagikan tiga gambar JPEG, Anda menggunakan jenis
"image/jpg"
. Untuk campuran jenis gambar, gunakan "image/*"
untuk mencocokkan
aktivitas yang menangani semua jenis gambar. Meskipun Anda dapat berbagi kombinasi jenis, kami sangat
tidak menyarankannya, karena tidak
jelas bagi penerima apa yang akan dikirim. Jika perlu mengirim beberapa jenis, gunakan
"*/*"
. Aplikasi penerima dapat
mengurai dan memproses data Anda. Berikut contohnya:
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
Pastikan objek Uri
yang diberikan mengarah
ke data yang dapat diakses 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 bisa 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 {i>thumbnail<i}. Untuk mengetahui informasi selengkapnya,
lihat Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Berikut contohnya:
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.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 = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
Pratinjau akan terlihat seperti ini:
Menambahkan tindakan kustom ke sharesheet
Di Android 14 (API Level 34) dan yang lebih baru, aplikasi dapat menambahkan tindakan kustom ke Sharesheet Android.
Tindakan kustom ditampilkan sebagai ikon tindakan kecil di bagian atas Android Sharesheet, dan aplikasi
dapat menentukan Intent
sebagai tindakan yang dipanggil saat ikon diklik.
Untuk menambahkan tindakan kustom di Android Sharesheet, pertama-tama buat
ChooserAction
dengan
ChooserAction.Builder
.
Anda dapat menetapkan 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.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "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)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Tambahkan target khusus
Android Sharesheet memungkinkan Anda menentukan hingga dua objek ChooserTarget
yang
ditampilkan sebelum pintasan berbagi dan target pemilih dimuat dari ChooserTargetServices
. Anda juga dapat
menentukan hingga dua intent yang mengarah ke aktivitas yang dicantumkan
sebelum saran aplikasi:
Tambahkan Intent.EXTRA_CHOOSER_TARGETS
dan Intent.EXTRA_INITIAL_INTENTS
ke
Intent berbagi setelah memanggil
Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Gunakan fitur ini secara cermat. Setiap Intent
dan ChooserTarget
kustom yang Anda tambahkan akan mengurangi jumlah yang disarankan sistem. Secara umum,
kami tidak menyarankan penambahan target kustom. Contoh umum yang tepat untuk menambahkan
Intent.EXTRA_INITIAL_INTENTS
adalah memberikan tindakan tambahan yang dapat dilakukan pengguna pada konten
bersama. Misalnya, pengguna membagikan gambar dan Intent.EXTRA_INITIAL_INTENTS
digunakan untuk
memungkinkan mereka mengirim link. Contoh umum yang tepat untuk menambahkan Intent.EXTRA_CHOOSER_TARGETS
adalah memunculkan orang atau perangkat yang relevan yang disediakan aplikasi Anda.
Mengecualikan target tertentu berdasarkan komponen
Anda dapat mengecualikan target tertentu dengan memasukkan Intent.EXTRA_EXCLUDE_COMPONENTS
.
Hanya lakukan ini untuk menghapus target yang Anda kontrol. Kasus penggunaan yang umum adalah menyembunyikan
target berbagi aplikasi saat pengguna Anda membagikan dari dalam aplikasi, karena intent mereka kemungkinan akan membagikan
di luar aplikasi Anda.
Tambahkan Intent.EXTRA_EXCLUDE_COMPONENTS
ke intent Anda setelah memanggil Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
Dapatkan informasi tentang berbagi
Mengetahui kapan pengguna berbagi dan target apa yang mereka pilih akan sangat berguna. Android Sharesheet memungkinkan Anda mendapatkan informasi ini dengan memberikan ComponentName
target yang dipilih pengguna menggunakan IntentSender
.
Pertama-tama, buat PendingIntent
untuk BroadcastReceiver
dan berikan
IntentSender
-nya di Intent.createChooser()
:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
Terima callback di MyBroadcastReceiver
dan lihat di
Intent.EXTRA_CHOSEN_COMPONENT
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Menambahkan tindakan kustom ke sharesheet
Di Android 14 (API Level 34) dan yang lebih baru, aplikasi dapat menambahkan tindakan kustom ke Android Sharesheet.
Buat ChooserAction
dengan
ChooserAction.Builder
.
Anda dapat menetapkan 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.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "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)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Menggunakan intent resolver Android
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
ACTION_SEND
dan jenis MIME, sistem akan menampilkan dialog disambiguasi yang disebut resolver intent
yang memungkinkan pengguna memilih target berbagi. Jika satu aplikasi cocok, aplikasi akan dijalankan.
Berikut adalah contoh cara menggunakan intent resolver Android untuk mengirim teks:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
Pelajari lebih lanjut
Untuk informasi selengkapnya tentang mengirim data, lihat Intent dan Filter Intent.