Mendeklarasikan kebutuhan visibilitas paket

Saat membuat aplikasi, penting untuk mempertimbangkan aplikasi lain di perangkat yang memerlukan interaksi aplikasi. Jika aplikasi Anda menargetkan Android 11 (API level 30) atau yang lebih baru, 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 aplikasi tertentu 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 fungsi 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 kode berikut menunjukkan elemen <intent> yang akan memungkinkan aplikasi melihat aplikasi terinstal lainnya yang mendukung 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 paling banyak 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 membuat 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 otoritas penyedia dalam satu elemen <queries>. Dalam elemen <queries>, Anda dapat mendeklarasikan satu atau beberapa elemen <provider>. Elemen <provider> dapat menyertakan satu otoritas penyedia atau daftar otoritas penyedia 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.

Beberapa contoh kasus penggunaan ketika izin QUERY_ALL_PACKAGES dirasa sesuai untuk disertakan:

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

Namun, biasanya Anda dapat memenuhi kasus penggunaan aplikasi melalui interaksi dengan kumpulan aplikasi yang otomatis terlihat dan deklarasi aplikasi lain yang perlu diakses oleh aplikasi Anda di file manifes. 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.