Mendeklarasikan kebutuhan visibilitas paket

Saat membuat aplikasi, penting untuk mempertimbangkan satu set aplikasi yang diinstal lainnya di perangkat, yang akan diakses oleh aplikasi Anda. Jika aplikasi Anda menargetkan Android 11 (API level 30) atau yang lebih tinggi, sistem akan membuat beberapa aplikasi otomatis terlihat oleh aplikasi Anda, tetapi aplikasi lain akan difilter secara default. Panduan ini menjelaskan cara membuat aplikasi lain tersebut terlihat oleh aplikasi Anda.

Jika aplikasi Anda menargetkan Android 11 atau yang lebih baru dan harus berinteraksi dengan aplikasi selain yang otomatis terlihat, tambahkan elemen <queries> dalam file manifes aplikasi Anda. Di dalam elemen <queries>, tentukan aplikasi lain berdasarkan nama paket, tanda tangan intent, atau otoritas penyedia, seperti yang dijelaskan di bagian berikut.

Nama paket tertentu

Jika Anda mengetahui kumpulan spesifik aplikasi yang ingin dibuat kuerinya atau dilibatkan dalam interaksi, seperti aplikasi yang dapat terintegrasi dengan aplikasi Anda, atau aplikasi yang layanannya Anda gunakan, sertakan 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>

Berkomunikasi dengan aplikasi host dalam library

Jika Anda mengembangkan library Android, Anda dapat mendeklarasikan kebutuhan visibilitas paket dengan menambahkan elemen <queries> di file manifes AAR. Elemen <queries> ini memiliki fungsionalitas yang sama seperti elemen yang dapat dideklarasikan oleh aplikasi dalam manifesnya sendiri.

Jika library Anda melibatkan komunikasi dengan aplikasi "host", seperti menggunakan layanan terikat, sertakan elemen <package> yang menentukan nama paket aplikasi host:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

Dengan menyertakan deklarasi ini, Anda dapat memeriksa apakah aplikasi host sudah diinstal dan berinteraksi dengannya, misalnya dengan memanggil bindService(). Aplikasi pemanggil yang menggunakan library Anda akan otomatis terlihat oleh aplikasi host sebagai hasil dari interaksi ini.

Paket yang cocok dengan tanda tangan filter intent

Aplikasi Anda mungkin perlu membuat kueri atau berinteraksi dengan kumpulan aplikasi yang memiliki tujuan tertentu, tetapi Anda mungkin tidak mengetahui nama paket khusus yang perlu disertakan. Dalam situasi ini, Anda dapat mencantumkan tanda tangan filter intent dalam elemen <queries>. Aplikasi Anda kemudian dapat menemukan aplikasi yang memiliki elemen <intent-filter> yang cocok.

Contoh berikut memungkinkan aplikasi Anda melihat aplikasi terinstal yang mendukung fitur berbagi gambar JPEG:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

Elemen <intent> memiliki beberapa batasan:

  • Anda harus menyertakan tepat satu elemen <action>.
  • Anda tidak boleh menggunakan atribut path, pathPrefix, pathPattern, atau port dalam elemen <data>. Sistem berperilaku seolah-olah Anda menetapkan setiap nilai atribut menjadi karakter pengganti generik (*).
  • Anda tidak boleh menggunakan atribut mimeGroup dari elemen <data>.
  • Dalam beberapa elemen <data> dari satu elemen <intent>, Anda dapat menggunakan masing-masing atribut berikut sebanyak satu kali:

    • mimeType
    • scheme
    • host

    Anda dapat mendistribusikan atribut ini di beberapa elemen <data> atau menggunakannya dalam satu elemen <data>.

Elemen <intent> mendukung nilai karakter pengganti generik (*) sebagai nilai untuk beberapa atribut:

  • Atribut name dari elemen <action>.
  • Subjenis atribut mimeType dari elemen <data> (image/*).
  • Jenis dan subjenis atribut mimeType dari elemen <data> (*/*).
  • Atribut scheme dari elemen <data>.
  • Atribut host dari elemen <data>.

Kecuali ditentukan lain dalam daftar sebelumnya, sistem tidak mendukung perpaduan karakter teks dan karakter pengganti, seperti prefix*.

Paket yang menggunakan otoritas tertentu

Jika Anda perlu mengajukan kueri ke penyedia konten tetapi tidak mengetahui nama paket yang spesifik, Anda dapat mendeklarasikan otoritas penyedia tersebut dalam elemen <provider>, seperti yang ditampilkan dalam cuplikan berikut:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

Anda dapat mendeklarasikan semua otoritas penyedia dalam satu elemen <queries>. Formatnya bergantung pada jumlah otoritas penyedia yang Anda deklarasikan:

Satu elemen <provider>
Pada elemen, deklarasikan daftar otoritas yang dipisahkan titik koma.
Beberapa elemen <provider>
Pada setiap elemen, deklarasikan satu otoritas atau daftar otoritas yang dipisahkan titik koma.

Semua aplikasi (tidak direkomendasikan)

Dalam kasus yang jarang terjadi, aplikasi Anda mungkin perlu membuat kueri atau berinteraksi dengan semua aplikasi terinstal yang ada di perangkat, terlepas dari komponen yang ada di dalamnya. Agar aplikasi Anda dapat melihat semua aplikasi lain yang diinstal, sistem memberikan izin QUERY_ALL_PACKAGES.

Daftar berikut memberikan beberapa contoh kasus penggunaan ketika izin QUERY_ALL_PACKAGES dirasa sesuai untuk disertakan:

  • Aplikasi aksesibilitas
  • Browser
  • Aplikasi pengelolaan perangkat
  • Aplikasi keamanan
  • Aplikasi antivirus

Namun, di sebagian besar kasus, Anda dapat memenuhi kasus penggunaan aplikasi Anda dengan berinteraksi dengan satu set aplikasi yang otomatis terlihat dan dengan mendeklarasikan aplikasi lain yang harus diakses oleh aplikasi Anda di file manifes Anda. Untuk menghormati privasi pengguna, aplikasi Anda harus meminta tingkat visibilitas paket terendah yang diperlukan agar aplikasi dapat berfungsi.

Pembaruan kebijakan dari Google Play ini memberikan pedoman untuk aplikasi yang memerlukan izin QUERY_ALL_PACKAGES.