Memberikan target Berbagi Langsung

Gambar 1: Baris Berbagi Langsung di Lembar Berbagi, seperti yang ditunjukkan oleh 1

Gunakan target Berbagi Langsung untuk mempermudah dan mempercepat pengguna aplikasi lain berbagi URL, gambar, atau jenis data lainnya dengan aplikasi Anda. Berbagi Langsung berfungsi dengan menampilkan kontak dari aplikasi pesan dan media sosial langsung di Lembar Berbagi Android, tanpa pengguna harus memilih aplikasi lalu mencari kontak.

ShortcutManagerCompat adalah AndroidX API yang menyediakan Sharing Shortcut, dan yang kompatibel mundur dengan ChooserTargetService API yang tidak digunakan lagi. Ini adalah cara yang lebih sering digunakan untuk memublikasikan Sharing Shortcut dan ChooserTargets. Untuk mengetahui petunjuknya, lihat Menggunakan AndroidX untuk menyediakan Sharing Shortcut dan ChooserTargets di halaman ini.

Memublikasikan target Direct Share

Baris Direct Share di sheet berbagi hanya menampilkan pintasan dinamis yang disediakan oleh Sharing Shortcuts API. Selesaikan langkah-langkah berikut untuk memublikasikan target Berbagi Langsung.

  1. Dalam file resource XML aplikasi Anda, deklarasikan elemen share-target.

    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity">
        <data android:mimeType="text/plain" />
        <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" />
    </share-target>
    </shortcuts>
    
  2. Saat aplikasi Anda diinisialisasi, gunakan setDynamicShortcuts untuk mengurutkan pintasan dinamis berdasarkan kepentingannya.

    Indeks yang lebih rendah menunjukkan kepentingan yang lebih besar. Jika Anda membuat aplikasi komunikasi, percakapan teratas dapat diurutkan berdasarkan kebaruan saat muncul di aplikasi Anda. Jangan memublikasikan pintasan yang sudah tidak berlaku; percakapan tanpa aktivitas pengguna dalam 30 hari terakhir dianggap sudah tidak berlaku.

    Kotlin

    ShortcutManagerCompat.setDynamicShortcuts(myContext, listOf(shortcut1, shortcut2, ..))

    Java

    List<ShortcutInfoCompat> shortcuts = new ArrayList<>();
    shortcuts.add(shortcut1);
    shortcuts.add(shortcut2);
    ...
    ShortcutManagerCompat.setDynamicShortcuts(myContext, shortcuts);
  3. Jika Anda mengembangkan aplikasi komunikasi, laporkan penggunaan pintasan melalui pushDynamicShortcut segera setiap kali pengguna menerima atau mengirim pesan ke kontak. Lihat Melaporkan penggunaan pintasan untuk aplikasi komunikasi di halaman ini untuk mengetahui informasi selengkapnya. Misalnya, laporkan penggunaan untuk pesan yang dikirim oleh pengguna dengan menentukan binding kemampuan dalam pintasan melalui ShortcutInfoCompat.Builder#addCapabilityBinding dengan kemampuan actions.intent.SEND_MESSAGE.

    Kotlin

    val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
      ...
      .setShortLabel(firstName)
      .setLongLabel(fullName)
      .setCategories(matchedCategories)
      .setLongLived(true)
    .addCapabilityBinding("actions.intent.SEND_MESSAGE").build()
    ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

    Java

    ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
      ...
      .setShortLabel(firstName)
      .setLongLabel(fullName)
      .setCategories(matchedCategories)
      .setLongLived(true)
      .addCapabilityBinding("actions.intent.SEND_MESSAGE")
      .build();
    
    ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
  4. Jika pengguna menghapus kontak, gunakan removeLongLivedShortcut. Ini adalah cara yang lebih disukai untuk menghapus pintasan, terlepas dari apakah pintasan tersebut di-cache oleh layanan sistem atau tidak. Cuplikan kode berikut menunjukkan contoh cara melakukannya.

    Kotlin

    val deleteShortcutId = "..."
    ShortcutManagerCompat.removeLongLivedShortcuts(myContext, listOf(deleteShortcutId))

    Java

    String deleteShortcutId = "...";
    ShortcutManagerCompat.removeLongLivedShortcuts(
        myContext, Arrays.asList(deleteShortcutId));

Meningkatkan peringkat target Berbagi Langsung

Android ShareSheet menunjukkan jumlah pasti target Direct Share. Saran ini diurutkan berdasarkan peringkat. Anda dapat meningkatkan peringkat pintasan dengan melakukan langkah berikut:

  • Pastikan semua shortcutIds unik dan tidak pernah digunakan kembali untuk target yang berbeda.
  • Pastikan pintasan bertahan lama dengan memanggil setLongLived(true).
  • Untuk pintasan terkait percakapan, laporkan penggunaan pintasan untuk pesan keluar dan masuk dengan memublikasikan ulang pintasan yang sesuai melalui ShortcutManagerCompat.pushDynamicShortcut. Lihat Melaporkan penggunaan pintasan untuk aplikasi komunikasi di halaman ini untuk mengetahui detailnya.
  • Hindari menyediakan target Berbagi Langsung yang tidak relevan atau tidak berlaku—misalnya, kontak yang belum dikirimi pesan oleh pengguna dalam 30 hari terakhir.
  • Untuk aplikasi SMS, hindari penyediaan pintasan untuk kode singkat atau percakapan yang diidentifikasi sebagai potensi spam. Pengguna kemungkinan besar tidak akan membagikan percakapan tersebut.
  • Panggil setCategories() untuk mengaitkan pintasan dengan atribut mimeType yang sesuai. Misalnya, untuk aplikasi SMS, jika kontak tidak mendukung RCS atau MMS, Anda tidak akan mengaitkan pintasan yang sesuai dengan jenis MIME non-teks seperti image/* dan video/*.
  • Untuk percakapan tertentu, setelah pintasan dinamis didorong dan penggunaan dilaporkan, jangan ubah ID pintasan. Hal ini memastikan retensi data penggunaan untuk peringkat.

Jika pengguna mengetuk target Direct Share, aplikasi Anda harus mengarahkan mereka ke UI tempat mereka dapat melakukan tindakan langsung pada subjek target. Jangan menampilkan UI disambiguasi kepada pengguna, dan jangan menempatkan mereka di UI yang tidak terkait dengan target yang diketuk. Misalnya, di aplikasi pesan, mengetuk target Direct Share akan mengarahkan pengguna ke tampilan percakapan dengan orang yang dipilihnya. Keyboard terlihat dan pesan terisi sebelumnya dengan data yang dibagikan.

Sharing Shortcuts API

Mulai Android 10 (level API 29), ShortcutInfo.Builder menambahkan metode dan peningkatan yang memberikan info tambahan tentang target berbagi:

setCategories()
Mulai Android 10, kategori juga digunakan untuk memfilter pintasan yang dapat menangani tindakan atau intent berbagi. Lihat Menyatakan target berbagi di bawah ini untuk mengetahui detailnya. Kolom ini wajib ada untuk pintasan yang ingin digunakan sebagai target berbagi.
setLongLived()

Menentukan apakah pintasan valid atau tidak setelah pintasan tersebut batal dipublikasikan atau dibuat tidak terlihat oleh aplikasi (sebagai pintasan dinamis atau pintasan yang dipasangi pin). Pintasan yang sudah lama dapat dimasukkan ke dalam cache oleh berbagai layanan sistem, bahkan setelah pintasan tersebut tidak dipublikasikan sebagai pintasan dinamis.

Membuat pintasan bertahan lama dapat meningkatkan peringkatnya. Lihat Mendapatkan peringkat terbaik untuk mengetahui detailnya.

setShortLabel(), setLongLabel()

Saat memublikasikan pintasan ke seseorang, sertakan nama lengkapnya di setLongLabel() dan nama pendek apa pun, misalnya nama panggilan atau nama depan, di setShortLabel().

Lihat contoh mempublikasikan Pintasan Berbagi di GitHub.

Menyediakan gambar pintasan

Untuk membuat Sharing Shortcut, Anda harus menambahkan gambar melalui setIcon().

Pintasan Berbagi dapat muncul di berbagai permukaan sistem dan dapat dibentuk ulang. Selain itu, beberapa perangkat yang menjalankan Android versi 7, 8, atau 9 (level API 25, 26, 27, dan 28) mungkin menampilkan ikon khusus bitmap tanpa latar belakang, yang mengurangi kontras secara signifikan. Untuk memastikan pintasan Anda terlihat sebagaimana mestinya, sediakan bitmap adaptif dengan menggunakan IconCompat.createWithAdaptiveBitmap().

Pastikan bitmap adaptif mengikuti panduan dan dimensi yang sama dengan yang ditetapkan untuk ikon adaptif. Cara paling umum untuk mencapai hal ini adalah dengan menskalakan bitmap persegi yang dimaksudkan ke 72x72 dp di tengah-tengah kanvas transparan 108x108 dp. Jika ikon Anda menyertakan area transparan, Anda harus menyertakan warna latar belakang; jika tidak, area transparan akan tampak hitam.

Jangan berikan gambar yang diberi mask sesuai dengan bentuk tertentu. Misalnya, sebelum Android 10 (API level 29), biasanya avatar pengguna disediakan untuk ChooserTarget Direct Share yang disamarkan ke sebuah lingkaran. Android ShareSheet dan permukaan sistem lainnya di Android 10 sekarang dapat mengatur bentuk dan tema gambar pintasan. Metode yang dipilih untuk menyediakan Sharing Shortcut, melalui ShortcutManagerCompat, akan otomatis membentuk objek ChooserTarget Direct Share dengan kompatibilitas mundur agar berbentuk lingkaran untuk Anda.

Mendeklarasikan target berbagi

Target berbagi harus dideklarasikan dalam file resource aplikasi, sama seperti definisi pintasan statis. Tambahkan definisi target berbagi di dalam elemen root <shortcuts> dalam file resource, bersama dengan definisi pintasan statis lainnya. Setiap elemen <share-targets> berisi informasi tentang jenis data yang dibagikan, kategori yang cocok, dan class target yang akan menangani intent berbagi. Kode XML-nya terlihat seperti ini:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity">
    <data android:mimeType="text/plain" />
    <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" />
  </share-target>
</shortcuts>

Elemen data dalam target berbagi mirip dengan spesifikasi data dalam filter intent. Setiap target berbagi dapat memiliki beberapa kategori, yang hanya digunakan untuk mencocokkan pintasan aplikasi yang dipublikasikan dengan definisi target berbaginya. Kategori dapat memiliki nilai yang ditentukan aplikasi secara arbitrer.

Jika pengguna memilih Sharing Shortcut di Android ShareSheet yang cocok dengan contoh target berbagi di atas, aplikasi akan mendapatkan intent berbagi berikut:

Action: Intent.ACTION_SEND
ComponentName: {com.example.android.sharingshortcuts /
                com.example.android.sharingshortcuts.SendMessageActivity}
Data: Uri to the shared content
EXTRA_SHORTCUT_ID: <ID of the selected shortcut>

Jika pengguna membuka target berbagi dari pintasan peluncur, aplikasi akan mendapatkan intent yang telah dibuat saat menambahkan pintasan berbagi ke ShortcutManagerCompat. Karena intent berbeda, Intent.EXTRA_SHORTCUT_ID tidak akan tersedia, dan Anda harus meneruskan ID secara manual jika memerlukannya.

Melaporkan penggunaan pintasan untuk aplikasi komunikasi

Jika Anda mengembangkan aplikasi komunikasi, Anda dapat meningkatkan peringkat di Lembar Berbagi Android dengan melaporkan penggunaan untuk pesan keluar dan masuk. Untuk melakukannya, publikasikan ulang pintasan percakapan yang merepresentasikan kontak melalui ShortcutManagerCompat.pushDynamicShortcut.

Penggunaan pintasan dan binding kemampuan kompatibel mundur dengan Android 5.0 (API 21).

Melaporkan penggunaan pintasan untuk pesan keluar

Pelaporan penggunaan untuk pesan yang dikirim oleh pengguna secara fungsional serupa dengan mengklik tombol "kirim" setelah membuat pesan.

Untuk memicu pelaporan penggunaan, tentukan binding kemampuan di pintasan melalui ShortcutInfoCompat.Builder#addCapabilityBinding dengan kemampuan actions.intent.SEND_MESSAGE.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
.addCapabilityBinding("actions.intent.SEND_MESSAGE").build()
ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.SEND_MESSAGE")
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Jika pesan keluar ditujukan untuk chat grup, Anda juga harus menambahkan nilai parameter Audience karena jenis recipient dikaitkan dengan kemampuan.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", listOf("Audience")).build()

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", Arrays.asList("Audience"))
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Melaporkan penggunaan pintasan untuk pesan masuk

Untuk memicu pelaporan penggunaan saat pengguna menerima pesan seperti SMS, pesan chat, email, atau notifikasi, Anda juga harus menentukan pengikatan kemampuan di pintasan melalui ShortcutInfoCompat.Builder#addCapabilityBinding dengan kemampuan actions.intent.RECEIVE_MESSAGE.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE").build()

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE")
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Jika pesan masuk berasal dari grup chat, Anda juga harus menambahkan nilai parameter Audience sebagai jenis sender yang terkait dengan kemampuan.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", listOf("Audience")).build()

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", Arrays.asList("Audience"))
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Menggunakan AndroidX untuk menyediakan Sharing Shortcut dan ChooserTargets

Agar dapat digunakan dengan library kompatibilitas AndroidX, manifes aplikasi harus memuat set filter intent dan layanan target pemilih metadata. Lihat ChooserTargetService Direct Share API saat ini.

Layanan ini sudah dideklarasikan dalam library kompatibilitas, sehingga pengguna tidak perlu mendeklarasikan layanan tersebut dalam manifes aplikasi. Namun, link dari aktivitas berbagi ke layanan ini harus diperhitungkan sebagai penyedia target pemilih (chooser target provider).

Pada contoh berikut, implementasi ChooserTargetService adalah androidx.core.content.pm.ChooserTargetServiceCompat, yang telah didefinisikan di AndroidX:

<activity
    android:name=".SendMessageActivity"
    android:label="@string/app_name"
    android:theme="@style/SharingShortcutsDialogTheme">
    <!-- This activity can respond to Intents of type SEND -->
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <!-- Only needed if you import the sharetarget AndroidX library that
         provides backwards compatibility with the old DirectShare API.
         The activity that receives the Sharing Shortcut intent needs to be
         taken into account with this chooser target provider. -->
    <meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
</activity>

FAQ Sharing Shortcut

Bagaimana data penggunaan pintasan disimpan dan apakah data tersebut keluar dari perangkat?

Pintasan disimpan sepenuhnya di perangkat di direktori data sistem dalam partisi disk terenkripsi. Informasi dalam pintasan seperti ikon, intent, serta nama orang dan resource hanya dapat diakses oleh layanan sistem dan aplikasi yang sama yang memublikasikan pintasan.

Apa riwayat Berbagi Langsung?

Kami memperkenalkan Direct Share di Android 6.0 (level API 23) untuk memungkinkan aplikasi menyediakan objek ChooserTarget melalui ChooserTargetService. Hasil diambil secara reaktif berdasarkan permintaan, yang berakibat pada waktu pemuatan target yang lambat.

Di Android 10 (level API 29), kami mengganti ChooserTargetService Direct Share API dengan Sharing Shortcuts API yang baru. Sharing Shortcuts API memungkinkan aplikasi memublikasikan target Berbagi Langsung lebih awal, bukan mengambil hasil secara reaktif sesuai permintaan. Hal ini mempercepat proses pengambilan target Berbagi Langsung saat menyiapkan ShareSheet. Mekanisme ChooserTargetService Direct Share akan terus berfungsi, tetapi sistem memberi peringkat target yang disediakan dengan cara ini lebih rendah daripada target yang menggunakan Sharing Shortcuts API.

Android 11 (API level 30) menghentikan penggunaan layanan ChooserTargetService, dan Sharing Shortcuts API adalah satu-satunya cara untuk menyediakan target Berbagi Langsung.

Apa perbedaan antara pintasan yang dipublikasikan untuk target berbagi dengan pintasan peluncur (penggunaan umum pintasan saat ikon aplikasi pada peluncur ditekan lama)?

Semua pintasan yang dipublikasikan untuk keperluan "target berbagi" juga merupakan pintasan peluncur, dan akan ditampilkan pada menu ketika ikon aplikasi ditekan lama. Batas jumlah pintasan maksimum per aktivitas juga berlaku untuk jumlah total pintasan yang dipublikasikan aplikasi (gabungan pintasan peluncur lama dan target berbagi).

Apa panduan tentang jumlah pintasan berbagi yang harus dipublikasikan.

Jumlah pintasan berbagi dibatasi hingga batas yang sama dengan pintasan dinamis yang tersedia melalui getMaxShortcutCountPerActivity(android.content.Context). Pengguna dapat memublikasikan nomor apa pun hingga batas tersebut, tetapi harus diingat bahwa pintasan berbagi dapat terlihat di tekan lama peluncur aplikasi dan di lembar berbagi. Sebagian besar peluncur aplikasi saat ditekan lama akan menampilkan maksimum empat atau lima pintasan dalam mode potret, dan delapan dalam mode lanskap. Lihat FAQ ini untuk mengetahui detail dan panduan selengkapnya tentang berbagi pintasan.