Ikuti Policy Webinar 2021 yang akan diselenggarakan tanggal 14 April mendatang!
Pelajari bagaimana Google Play berkomitmen untuk memberikan pengalaman yang aman dan terpercaya bagi pengguna, serta developer.
Kebijakan kami dirancang untuk mendistribusikan aplikasi dan game secara aman kepada triliun pengguna di seluruh dunia.
Melalui acara Policy Webinar 2021, pelajari kebijakan terbaru dari tim Google, serta jangan lewatkan kesempatan tanya-jawab bersama para pakar seputar update kebijakan baru ini.
Daftar sekarang!
goo.gle/3do10tE

Pengantar:

Di Android, kami membuat perubahan untuk menyempurnakan privasi pengguna dan keamanan platform guna memberikan pengalaman yang lebih baik kepada pengguna. Aplikasi yang menargetkan Android 11 (API level 30) ke atas hanya akan melihat daftar aplikasi terfilter yang diinstal di perangkat. Untuk mengakses aplikasi di luar daftar terfilter, aplikasi harus mendeklarasikan aplikasi apa saja yang diperlukannya untuk berinteraksi langsung dengan menggunakan elemen <queries> di manifes Android. Postingan blog ini akan membahas praktik terbaik tentang cara beradaptasi dengan fitur ini.


Membuat kueri dan berinteraksi dengan aplikasi:

Ada berbagai cara untuk membuat kueri dan berinteraksi dengan aplikasi:

  • Jika Anda ingin melakukan kueri atau berinteraksi dengan sekumpulan aplikasi yang Anda ketahui, masukkan nama paketnya dalam kumpulan elemen <package> di dalam elemen <queries>.

<manifest package="com.example.game">

<queries>

<package android:name="com.example.store" />

<package android:name="com.example.services" />

</queries>

...

</manifest>


  • Jika aplikasi Anda perlu membuat kueri atau berinteraksi dengan kumpulan aplikasi yang dipakai untuk tujuan tertentu, tetapi mungkin Anda tidak tahu nama paket yang harus disertakan, Anda bisa menampilkan daftar tanda tangan filter intent di elemen <queries> Anda. Setelah itu aplikasi Anda bisa menemukan aplikasi yang memiliki elemen <intent-filter> yang cocok.

<manifest package="com.example.game">

<queries>

<intent>

<action android:name="android.intent.action.SEND" />

<data android:mimeType="image/jpeg" />

</intent>

</queries>

...

</manifest>


  • Jika Anda perlu membuat kueri penyedia konten tetapi tidak mengetahui nama paket spesifiknya, Anda bisa mendeklarasikan otoritas penyedia tersebut dalam elemen <provider>.

<manifest package="com.example.suite.enterprise">

<queries>

<provider android:authorities="com.example.settings.files" />

</queries>

...

</manifest>

Kami mendorong minimalisasi data dengan hanya membuat kueri untuk paket yang Anda gunakan. QUERY_ALL_PACKAGES atau elemen <intent> global setara hanya boleh digunakan oleh aplikasi yang membutuhkan level informasi ini. Kebijakan Visibilitas Paket baru kami memperkenalkan proses persetujuan untuk izin QUERY_ALL_PACKAGES baru yang mengontrol akses ke inventori aplikasi terinstal di perangkat. Baca selengkapnya di sini.

Flag Activity:

Sebagian besar kasus penggunaan umum tidak mengharuskan aplikasi Anda memiliki visibilitas paket global. Pada banyak skenario, Anda bisa menggunakan startActivity() dan menangkap pengecualian jika tidak ada aplikasi yang bisa membuka intent ini.


try {

val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {

addCategory(CATEGORY_BROWSABLE)

}

startActivity(intent)

} catch (e: ActivityNotFoundException) {

Snackbar.make(it,"Activity Not Found",Snackbar.LENGTH_LONG).show()

}


Meskipun Anda bisa memulai aktivitas apa pun tanpa visibilitas target, Anda tidak bisa membuat kueri ketersediaan aktivitas itu sebelum memulainya atau mempelajari aplikasi spesifik yang akan diluncurkan karena merupakan intent implisit. Sebagai gantinya, Anda akan diberi tahu saat memulai jika hal itu tidak di-resolve. Untuk membantu menanganinya, Anda bisa menggunakan flag:


FLAG_ACTIVITY_REQUIRE_NON_BROWSER

Flag ini hanya meluncurkan intent jika intent tersebut di-resolve ke hasil yang bukan browser. Jika tidak ada hasil seperti itu, ActivityNotFoundExeception akan ditampilkan dan aplikasi Anda bisa membuka URL di tab khusus.


val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {

// The URL should either launch directly in a non-browser app (if it's

// the default), or in the disambiguation dialog.

addCategory(CATEGORY_BROWSABLE)

flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER

}


Jika sebuah intent memuat flag ini, panggilan ke startActivity() akan menyebabkan ActivityNotFoundException ditampilkan ketika panggilan tersebut meluncurkan aplikasi browser atau panggilan tersebut akan menampilkan dialog konfirmasi kepada pengguna, di mana satu-satunya pilihan adalah aplikasi browser. Untuk membaca selengkapnya tentang flag, lihat Mengonfigurasi Visibilitas paket berdasarkan kasus penggunaan

Contoh umum yang menggunakan flag adalah Tab Khusus, yang memungkinkan aplikasi menyesuaikan tampilan dan cara kerja browser. Link akan terbuka dengan benar di aplikasi non-browser jika tersedia, tetapi flag ini membantu dalam kasus tingkat lanjut yaitu ketika developer ingin lebih selektif mengenai browser Tab Khusus yang akan mereka gunakan.

Menyesuaikan share sheet

Kami merekomendasikan penggunaan share sheet sistem daripada share sheet khusus. Anda bisa menyesuaikan share sheet sistem tanpa memerlukan visibilitas aplikasi. Lihat dokumentasi ini untuk informasi selengkapnya.


Proses Debug Visibilitas Paket


Anda bisa dengan mudah memeriksa manifes untuk melihat semua kueri yang dimasukkan. Untuk melakukannya, buka file manifes Anda dan pilih Merged Manifest.



Anda juga bisa mengaktifkan pesan log untuk melakukan pemfilteran paket guna melihat bagaimana pengaruh visibilitas default pada aplikasi Anda:

$ adb shell pm log-visibility --enable YOUR_PACKAGE_NAME


Langkah berikutnya:

Untuk informasi selengkapnya tentang Visibilitas Paket, lihat referensi ini:

Selamat membuat kode!