Mengirim data sederhana ke aplikasi lain

Android menggunakan intent dan tambahan terkait agar pengguna bisa berbagi informasi dengan cepat dan dengan mudah menggunakan aplikasi favorit mereka.

Android menyediakan dua cara bagi pengguna untuk berbagi data antar-aplikasi:

  • Android Sharesheet utamanya didesain untuk mengirim konten ke luar aplikasi dan/atau secara langsung ke pengguna lain. Misalnya, berbagi URL dengan teman.
  • Intent resolver Android paling cocok untuk meneruskan data ke tahap selanjutnya dari tugas yang terdefinisi dengan baik. Misalnya, membuka PDF dari aplikasi dan mengizinkan pengguna memilih penonton yang mereka inginkan.

Saat membuat intent, Anda harus menetapkan tindakan yang diinginkan untuk dilakukan intent tersebut. Android menggunakan tindakan ACTION_SEND untuk mengirim data dari satu aktivitas ke aktivitas lainnya, bahkan lintas batas proses. Anda harus menentukan data dan jenisnya. Sistem secara otomatis mengidentifikasi aktivitas yang kompatibel yang dapat menerima data dan menampilkannya kepada pengguna. Dalam kasus intent resolver, jika hanya 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 Anda 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 satu ketukan. Sharesheet dapat menyarankan target yang tidak tersedia untuk solusi khusus dan menggunakan peringkat yang konsisten. Hal ini karena Sharesheet dapat memperhitungkan informasi tentang aktivitas pengguna dan aplikasi yang hanya tersedia untuk sistem.

Android Sharesheet juga memiliki banyak fitur yang berguna bagi developer. Misalnya, Anda dapat melakukan hal berikut:

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 ke sini. Metode ini mengembalikan 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 berbagi URL yang sedang ditampilkan laman sebagai teks dengan aplikasi lain. Ini berguna untuk berbagi artikel atau situs web dengan teman melalui email atau jejaring sosial. Berikut ini contoh cara melakukannya:

KotlinJava
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)
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.

Mengirim konten biner

Bagikan data biner menggunakan tindakan ACTION_SEND. Tetapkan jenis MIME yang sesuai dan tempatkan URI ke data dalam ekstra EXTRA_STREAM, sebagai yang ditunjukkan dalam contoh berikut. Umumnya ini digunakan untuk membagikan gambar, tetapi bisa untuk membagikan semua jenis konten biner.

KotlinJava
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))
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 di Uri pengguna. 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 sementara dan hanya memberikan akses ke aplikasi penerima. Cara mudah untuk membuat ContentProvider seperti ini adalah dengan menggunakan class helper FileProvider.
  • Gunakan MediaStore sistem. MediaStore utamanya untuk jenis MIME video, audio, dan gambar. Namun, mulai Android 3.0 (API level 11), jenis ini juga dapat menyimpan jenis non-media. Untuk informasi selengkapnya, lihat MediaStore.Files. File dapat disisipkan ke dalam MediaStore menggunakan scanFile(), Setelah itu, Uri gaya content:// cocok untuk dibagikan diteruskan ke onScanCompleted() . Perhatikan bahwa setelah ditambahkan ke MediaStore sistem, 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 dikirim. Misalnya, gunakan text/plain saat membagikan teks biasa. Berikut beberapa jenis MIME umum saat mengirim data sederhana di Android:

Penerima mendaftar untuk Pengirim mengirim
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Ekstensi file yang didukung application/pdf

Untuk informasi selengkapnya tentang jenis MIME, lihat IANA registry resmi 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 konten

Untuk membagikan beberapa konten, gunakan tindakan ACTION_SEND_MULTIPLE bersama dengan daftar URI yang mengarah ke konten. Jenis MIME bervariasi sesuai dengan kombinasi konten yang Anda bagikan. Misalnya, jika Anda membagikan tiga gambar JPEG, Anda menggunakan jenis "image/jpg". Untuk gabungan jenis gambar, gunakan "image/*" untuk mencocokkan yang menangani semua jenis gambar. Meskipun kita bisa berbagi berbagai jenis data, jangan lakukan hal ini, karena tidak jelas kepada penerima apa yang akan dikirim. Jika perlu mengirim beberapa jenis, gunakan "*/*". Aplikasi penerima dapat mengurai dan memproses data Anda. Berikut contohnya:

KotlinJava
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))
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 (API level 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. Fitur yang lebih kaya dapat meyakinkan pengguna tentang apa yang akan 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 memberikan izin yang tepat untuk membaca gambar apa pun yang ingin Anda gunakan sebagai gambar mini. Untuk informasi selengkapnya, lihat Intent.FLAG_GRANT_READ_URI_PERMISSION.

Berikut contohnya:

KotlinJava
 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)
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));

Pratinjaunya akan terlihat seperti ini:

Menambahkan tindakan kustom ke sharesheet

Screenshot tindakan kustom di Android Sharesheet.

Di Android 14 (API Level 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 sebagai tindakan yang dipanggil saat ikon diklik.

Untuk menambahkan tindakan kustom di Sharesheet Android, buat ChooserAction dengan ChooserAction.Builder terlebih dahulu. 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.

KotlinJava
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)
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 menetapkan hingga dua intent yang menunjuk ke aktivitas yang terdaftar sebelum saran aplikasi:

Tambahkan Intent.EXTRA_CHOOSER_TARGETS dan Intent.EXTRA_INITIAL_INTENTS ke Intent bersama setelah memanggil Intent.createChooser():

KotlinJava
val share = Intent.createChooser(myShareIntent, null).apply {
    putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray)
    putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray)
}
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 menyediakan tindakan tambahan yang dapat dilakukan pengguna pada konten yang dibagikan. Misalnya, pengguna membagikan gambar dan Intent.EXTRA_INITIAL_INTENTS digunakan untuk membiarkan mereka mengirim tautan. Contoh umum yang tepat untuk menambahkan Intent.EXTRA_CHOOSER_TARGETS adalah untuk menampilkan orang atau perangkat yang relevan yang disediakan aplikasi Anda.

Mengecualikan target tertentu berdasarkan komponen

Anda dapat mengecualikan target tertentu dengan menyediakan Intent.EXTRA_EXCLUDE_COMPONENTS. Hanya lakukan tindakan ini untuk menghapus target yang dapat 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():

KotlinJava
  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)
  }
  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 menyediakan ComponentName target yang dipilih pengguna menggunakan IntentSender.

Pertama-tama, buat PendingIntent untuk BroadcastReceiver dan berikan IntentSender di Intent.createChooser():

KotlinJava
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)
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:

KotlinJava
override fun onReceive(context: Context, intent: Intent) {
  ...
  val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}
@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. Membuat 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.

KotlinJava
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)
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

Screenshot intent resolver 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 sesuai ACTION_SEND dan jenis MIME, sistem akan menampilkan dialog disambiguasi yang disebut intent resolver yang memungkinkan pengguna memilih target berbagi. Jika satu aplikasi cocok, sistem akan berjalan.

Berikut adalah contoh cara menggunakan intent resolver Android untuk mengirim teks:

KotlinJava
val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
    type = "text/plain"
}
startActivity(sendIntent)
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.