Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Peningkatan fitur berbagi

Android Q menyediakan sejumlah fitur baru terkait fitur berbagi.

Sharing Shortcuts API

ShareSheet telah berubah di Android Q. Direct Share API telah diganti dengan Sharing Shortcuts API baru. Mekanisme Direct Share yang sudah ada akan tetap berfungsi, tetapi memiliki prioritas lebih rendah dibandingkan semua aplikasi yang menggunakan API baru.

Bukannya mengambil hasil secara reaktif sesuai permintaan, Sharing Shortcuts API memungkinkan aplikasi memublikasikan target berbagi langsung lebih awal. Begitulah cara kerja ShortcutManager. Karena kedua API ini serupa, kami telah memperluas ShortcutInfo API untuk mempermudah penggunaan kedua fitur. Dengan API baru, Anda dapat langsung menetapkan kategori atau orang ke target berbagi. Target berbagi bertahan di dalam sistem hingga aplikasi yang sama memperbaruinya atau aplikasi tersebut di-uninstall.

Kode Sampel: SharingShortcuts

Memublikasikan target berbagi langsung

Saat ini, hanya pintasan dinamis yang didukung untuk memublikasikan target berbagi langsung. Ikuti langkah berikut untuk memublikasikan target berbagi langsung menggunakan API baru:

  1. Nyatakan elemen target berbagi dalam file resource XML aplikasi. Untuk selengkapnya, lihat Menyatakan target berbagi di bawah ini.
  2. Publikasikan pintasan dinamis beserta kategori pencocokan ke target berbagi yang dinyatakan. Pintasan dapat ditambahkan, diakses, diupdate, dan dihapus menggunakan ShortcutManager atau ShortcutManagerCompat di AndroidX. Penggunaan library kompatibilitas di AndroidX merupakan metode yang lebih baik karena menyediakan kompatibilitas mundur pada versi Android yang lebih lama.

DirectShare API

ShortcutInfo.Builder menyertakan metode baru dan disempurnakan yang memberikan info tambahan tentang target berbagi:

setCategories()
Ini bukan metode baru, tetapi sekarang kategori juga digunakan untuk memfilter pintasan yang dapat menangani tindakan atau intent berbagi. Lihat Menyatakan target berbagi di bawah ini untuk penjelasan selengkapnya. 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 sematan). Pintasan yang sudah lama dapat dimasukkan ke cache oleh berbagai layanan sistem bahkan setelah pintasan tersebut tidak dipublikasikan sebagai pintasan dinamis.
setPerson(), setPersons()

Mengaitkan satu atau beberapa objek Person dengan pintasan. Cara ini dapat digunakan untuk memahami perilaku pengguna di berbagai aplikasi dengan lebih baik, dan membantu layanan prediksi potensial pada framework untuk memberikan saran yang lebih baik di ShareSheet. Penambahan info Person ke pintasan bersifat opsional, tetapi sangat direkomendasikan jika target berbagi dapat dikaitkan dengan orang. Perhatikan bahwa beberapa target berbagi, seperti cloud, tidak dapat dikaitkan dengan orang.

Menyertakan objek Person tertentu dengan id unik dalam target berbagi dan notifikasi terkait dapat meningkatkan urutan saran. Gunakan setKey().

Untuk aplikasi pesan standar, target berbagi terpisah (pintasan) harus dipublikasikan untuk setiap kontak, dan kolom Person harus memuat info kontak. Jika target dapat dikaitkan dengan banyak orang (seperti grup chat), tambahkan beberapa Person ke satu target berbagi.

Menyatakan target berbagi

Target berbagi harus dinyatakan dalam file resource aplikasi, mirip dengan definisi pintasan statis. Tambahkan definisi target berbagi di dalam elemen root <shortcuts> pada file resource, beserta definisi pintasan statis lainnya. Setiap elemen <share-target> berisi informasi tentang jenis data yang dibagikan, kategori pencocokan, dan kelas target yang akan menangani intent berbagi. Kode XML-nya terlihat sebagai berikut:

<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 sembarang nilai yang ditentukan aplikasi.

Jika pengguna memilih target berbagi langsung (pintasan) di ShareSheet yang cocok dengan contoh target berbagi di atas, aplikasi akan mendapatkan intent berbagi sebagai 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 tersebut berbeda, Intent.EXTRA_SHORTCUT_ID tidak akan tersedia, dan Anda harus meneruskan ID secara manual jika memerlukannya.

Menyatakan target kustom

Sistem ini 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 EXTRA_CHOOSER_TARGETS dan EXTRA_INITIAL_INTENTS ke intent berbagi Anda sebelum memanggil Intent.createChooser().

Mengenali aplikasi Anda

Saat pengguna berbagi, aplikasi Anda ditunjukkan oleh ikon dan labelnya, yang ditentukan dalam manifes. Pastikan ikon atau label tersebut dapat mengidentifikasi aplikasi Anda dengan jelas sehingga pengguna dapat memahami apa target berbagi Anda beserta fungsinya. Anda dapat menyetel label filter aktivitas atau intent untuk memberikan lebih banyak konteks.

Target berbagi terbaik tidak memerlukan aktivitas pendukung atau label filter intent. Cukup dengan nama aplikasi penerima, pengguna dapat memahami apa yang akan terjadi setelah berbagi.

DirectShare di AndroidX

ShortcutManagerCompat adalah AndroidX API baru yang menyediakan kompatibilitas mundur dengan DirectShare API lama. Penggunaan API baru ini direkomendasikan untuk memublikasikan target berbagi.

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

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

Dalam contoh berikut, implementasi ChooserTargetService adalah androidx.core.content.pm.ChooserTargetServiceCompat, yang telah ditentukan dalam 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>
    

Pratinjau konten

Saat berbagi konten, aplikasi dapat menampilkan pratinjau opsional dari konten tersebut di UI Sharesheet.

Pratinjau dapat memiliki judul, gambar, atau keduanya.

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.setClipData(contentUri);
    sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    // Start the chooser to show the Sharesheet
    startActivity(Intent.createChooser(sendIntent, null));
    

URI konten gambar harus disediakan dari FileProvider, biasanya dari <cache-path> yang dikonfigurasi. Lihat Berbagi file.

Contoh lengkap dapat dilihat di aplikasi sampel.

FAQ

Apa perbedaan utama antara API baru dan DirectShare API lama?

API baru menggunakan model push, sedangkan DirectShare API lama menggunakan model pull. Cara ini mempercepat proses pengambilan target berbagi langsung saat menyiapkan ShareSheet. Dari sudut pandang developer aplikasi, jika API baru digunakan, aplikasi perlu menyediakan daftar target berbagi langsung di awal, dan kemungkinan harus mengupdate daftar pintasan setiap kali keadaan internal aplikasi berubah (misalnya, jika kontak baru ditambahkan ke aplikasi pesan).

Apa yang terjadi jika saya tidak bermigrasi untuk menggunakan API baru?

Pada Android Q dan yang lebih tinggi, ShareSheet akan menempatkan prioritas yang lebih tinggi pada target berbagi yang disediakan melalui ShortcutManager (API baru). Akibatnya, target berbagi yang telah Anda publikasikan mungkin akan terkubur oleh target berbagi aplikasi lain dan berpotensi tidak pernah muncul saat berbagi.

Dapatkah saya menggunakan DirectShare API lama dan baru dalam aplikasi saya untuk mendapatkan kompatibilitas dengan versi lama?

Jangan lakukan itu! Sebagai gantinya, gunakan API library dukungan yang disediakan (ShortcutManagerCompat). Menggabungkan dua set API dapat mengakibatkan perilaku yang tidak diinginkan/tidak terduga saat mengambil target berbagi.

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

Semua pintasan yang dipublikasikan untuk keperluan "berbagi target" juga merupakan pintasan peluncur, dan akan ditampilkan di 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).