Mengirimkan data sederhana ke aplikasi lain

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 harus 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 harus 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, maka aktivitas tersebut akan langsung dimulai.

Mengapa Anda harus menggunakan Android Sharesheet

Kami sangat sarankan menggunakan Android Sharesheet untuk menciptakan konsistensi bagi pengguna Anda di seluruh aplikasi. Aplikasi tidak akan menampilkan daftar target berbagi atau membuat variasi Sharesheet miliknya sendiri.

Android Sharesheet memberikan kemampuan kepada pengguna untuk berbagi informasi kepada orang yang tepat dengan saran aplikasi yang relevan, semuanya dengan satu ketukan. Sharesheet dapat menyarankan target yang tidak tersedia untuk solusi khusus, dan dengan 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:

Menggunakan Android Sharesheet

Untuk semua jenis berbagi, buat intent dan tetapkan tindakannya ke Intent.ACTION_SEND. Agar dapat menampilkan Android Sharesheet, Anda perlu memanggil Intent.createChooser(), dan meneruskannya ke objek Intent. Tindakan ini mengembalikan versi intent Anda yang akan 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, kebanyakan browser dapat berbagi URL halaman yang sedang ditampilkan sebagai teks dengan 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 bisa menambahkan tambahan guna mencantumkan lebih banyak informasi, seperti penerima email (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), subjek email (EXTRA_SUBJECT), dan seterusnya.

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 EXTRA_STREAM tambahan. Umumnya ini digunakan untuk membagikan gambar, tetapi bisa untuk membagikan semua jenis konten biner:

Kotlin

    val shareIntent: Intent = Intent().apply {
        action = Intent.ACTION_SEND
        putExtra(Intent.EXTRA_STREAM, uriToImage)
        type = "image/jpeg"
    }
    startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.send_to)))
    

Java

    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
    shareIntent.setType("image/jpeg");
    startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
    

Aplikasi penerima perlu izin mengakses data yang ditunjuk Uri. Cara yang disarankan adalah:

  • 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 membuat ContentProvider seperti ini adalah dengan menggunakan class bantuan FileProvider.
  • Gunakan MediaStore sistem. MediaStore utamanya untuk jenis MIME video, audio, dan gambar, tetapi mulai Android 3.0 (API level 11) bisa juga menyimpan jenis non-media (lihat MediaStore.Files untuk info selengkapnya). File dapat dimasukkan ke MediaStore menggunakan scanFile(). Setelah itu, Uri bergaya content:// yang cocok untuk berbagi diteruskan ke callback onScanCompleted() yang disediakan. Ingat, setelah ditambahkan ke MediaStore sistem, konten dapat diakses oleh aplikasi apa pun di perangkat.

Menggunakan jenis MIME yang tepat

Anda harus menyediakan jenis MIME yang paling spesifik untuk data yang Anda kirim. Misalnya, Anda harus menggunakan text/plain saat membagikan teks biasa. Berikut ini beberapa jenis MIME yang umum saat mengirim data sederhana di Android.

  • text/plain, text/rtf, text/html, text/json, penerima harus mendaftarkan text/*
  • image/jpg, image/png, image/gif, penerima harus mendaftarkan image/*
  • video/mp4, video/3gp, penerima harus mendaftarkan video/*
  • application/pdf, penerima harus mendaftarkan ekstensi file yang didukung
  • Anda dapat menggunakan jenis MIME */*, tetapi ini sangat tidak dianjurkan dan hanya akan cocok dengan aktivitas yang bisa menangani aliran data generik.

Android Sharesheet bisa menampilkan pratinjau konten berdasarkan jenis MIME yang disediakan. Beberapa fitur pratinjau hanya tersedia untuk jenis tertentu.

Lihat registry resmi IANA untuk jenis media MIME.

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, jenisnya masih "image/jpg". Untuk kombinasi jenis gambar, kombinasinya harus berupa "image/*" agar cocok dengan aktivitas yang menangani semua jenis gambar. Meskipun memungkinkan untuk berbagi kombinasi jenis, tindakan ini sangat tidak dianjurkan karena tidak jelas bagi penerima apa yang akan dikirim. Jika perlu mengirim beberapa jenis, gunakan "*/*". Aplikasi penerima bisa mengurai dan memproses data Anda. Berikut ini 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, "Share images to.."))
    

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, "Share images to.."));
    

Pastikan URIs 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 akan 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 beragam dapat meyakinkan pengguna terkait 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(). Tambahkan thumbnail yang relevan melalui ClipData.

Catatan: URI konten gambar harus disediakan dari FileProvider, biasanya dari <cache-path> yang dikonfigurasi. Lihat Berbagi file. Pastikan memberi Sharesheet izin yang tepat untuk membaca gambar apa pun yang ingin Anda gunakan sebagai thumbnail. 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 we're setting the title of the content
          putExtra(Intent.EXTRA_TITLE, "Introducing content previews")

          // (Optional) Here we'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, "Hello!");

    // (Optional) Here we're setting the title of the content
    sendIntent.putExtra(Intent.EXTRA_TITLE, "Send message");

    // (Optional) Here we'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 terlihat seperti ini:

Menambahkan target kustom

Android Sharesheet memungkinkan Anda menentukan objek ChooserTarget dalam jumlah terbatas yang ditampilkan sebelum pintasan berbagi dan ChooserTargets dimuat dari ChooserTargetServices. Anda juga dapat menentukan intent tertentu dalam jumlah terbatas yang mengarah ke aktivitas yang dicantumkan sebelum saran aplikasi.

Tambahkan Intent.EXTRA_CHOOSER_TARGETS dan Intent.EXTRA_INITIAL_INTENTS ke Intent bersama 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

    val share = Intent.createChooser(myShareIntent, 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. Menambahkan target kustom biasanya tidak dianjurkan. 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 memberi kemampuan bagi pengguna untuk mengirim link sebagai gantinya. 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 menyediakan Intent.EXTRA_EXCLUDE_COMPONENTS.. Ini hanya digunakan 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(myShareIntent, null).apply {
      // Only use components you have control over
      share.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, myComponentArray)
    }
    

Java

    share = Intent.createChooser(myShareIntent, null);
    // Only use components you have control over
    share.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, myComponentArray);
    

Mendapatkan informasi tentang berbagi

Informasi ini mungkin bermanfaat untuk mengetahui kapan pengguna Anda berbagi dan target apa yang dipilihnya. Android Sharesheet memungkinkan ini dengan menyediakan ComponentName target yang diklik pengguna Anda melalui IntentSender.

Pertama, buat PendingIntent untuk BroadcastReceiver dan sediakan IntentSender di Intent.createChooser()

Kotlin

    var share = new Intent(Intent.ACTION_SEND);
    ...
    val pi = PendingIntent.getBroadcast(myContext, requestCode, Intent(myContext, MyBroadcastReceiver.class),
    Intent.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),
                    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);
    }
    

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 jika 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 yang akan dibagikan. Jika satu aplikasi cocok, maka akan berjalan.

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

Selengkapnya

Untuk mengetahui informasi selengkapnya tentang mengirim data, lihat Intent dan Filter Intent.