宣告套件瀏覽權限需求

建立應用程式時,請務必考量需要與應用程式進行互動的其他應用程式。如果您的應用程式指定 Android 11 (API 級別 30) 以上版本,系統會自動向您的應用程式授予部分應用程式的瀏覽權限,但預設會篩除其他應用程式。本指南會說明如何為您的應用程式授予其他應用程式的瀏覽權限。

如果應用程式指定的是 Android 11 以上版本,且除了系統自動授予瀏覽權限的應用程式,還需要與其他應用程式互動,請在應用程式的資訊清單檔案中加入 <queries> 元素。在 <queries> 元素中,根據套件名稱意圖簽章供應器授權指定其他應用程式,如後續章節所述。

特定套件名稱

如果您知道要查詢或互動的特定應用程式,例如與您的應用程式整合的應用程式,或是您使用其服務的應用程式,請將套件名稱加到 <queries> 元素內的一組 <package> 元素中:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

與程式庫中的主機應用程式通訊

如果您開發 Android 程式庫,只要在 AAR 資訊清單檔案中新增 <queries> 元素,即可宣告套件的瀏覽權限需求。此 <queries> 元素的功能與應用程式可在其資訊清單中宣告的元素相同。

如果程式庫會與主應用程式通訊 (例如使用繫結服務),請加入指定主應用程式套件名稱的 <package> 元素:

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

納入此宣告後,即可檢查主應用程式是否已安裝,並與該應用程式互動,例如呼叫 bindService()。透過此互動,使用程式庫的呼叫應用程式會自動顯示在主機應用程式中。

符合意圖篩選器簽章的套件

您的應用程式可能需要查詢或與具有特定用途的應用程式組合互動,但您可能不知道要包含的套件名稱。在此情況下,您可以在 <queries> 元素中列出意圖篩選器簽章。這樣一來,您的應用程式就可找出符合 <intent-filter> 元素的應用程式。

以下程式碼範例顯示 <intent> 元素,可讓應用程式看到其他支援 JPEG 圖片共用功能的安裝版應用程式:

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

<intent> 元素具有下列限制:

  • 只能包含一個 <action> 元素。
  • 無法在 <data> 元素中使用 pathpathPrefixpathPatternport 屬性。系統會假設將每個屬性的值設為一般萬用字元字元 (*) 來運作。
  • 無法使用 <data> 元素的 mimeGroup 屬性。
  • 在單一 <intent> 元素的 <data> 元素中,最多可以使用以下每個屬性:

    • mimeType
    • scheme
    • host

    您可以將這些屬性發佈至多個 <data> 元素,或在單一 <data> 元素中使用這些屬性。

<intent> 元素支援一般萬用字元 (*) 做為幾個屬性的值:

  • <action> 元素的 name 屬性。
  • <data> 元素 (image/*) 的 mimeType 屬性子類型。
  • <data> 元素 (*/*) 的 mimeType 屬性類型和子類型。
  • <data> 元素的 scheme 屬性。
  • <data> 元素的 host 屬性。

除非另有設定,否則系統不支援混合使用文字和萬用字元,如 prefix*

使用特定授權的套件

如果需要查詢某個內容供應器,但您不知道特定套件名稱,可以在 <provider> 元素中宣告供應器授權,如以下程式碼片段所示:

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

您可以在單一 <queries> 元素中宣告多個供應器授權,也可以在 <queries> 元素中宣告一或多個 <provider> 元素。<provider> 元素可包含單一供應器授權,或是以半形分號分隔的供應器授權清單。

所有應用程式 (不建議)

在極少數情況下,您的應用程式可能會查詢裝置上的所有安裝版應用程式,或是與之互動,不論其中包含的元件為何。為了讓您的應用程式能夠查看所有其他安裝版應用程式,系統會提供 QUERY_ALL_PACKAGES 權限。

以下列舉適合納入 QUERY_ALL_PACKAGES 權限的一些用途:

  • 無障礙應用程式
  • 瀏覽器
  • 裝置管理應用程式
  • 安全性應用程式
  • 防毒應用程式

不過,您通常可以透過以下方式實現應用程式的用途:與系統自動授予瀏覽權限的應用程式組合互動,以及在資訊清單檔案中宣告應用程式需要存取的其他應用程式。為尊重使用者隱私,您的應用程式應要求最低限度所需的套件瀏覽權限,以便讓應用程式正常運作。

這份 Google Play 政策更新提供了需要 QUERY_ALL_PACKAGES 權限的應用程式所適用的規範。