建立應用程式時,請務必考量需要與應用程式進行互動的其他應用程式。根據預設,如果應用程式指定的是 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>
元素中使用path
、pathPrefix
、pathPattern
或port
屬性。系統會假設將每個屬性的值設為一般萬用字元字元 (*
) 來運作。 - 無法使用
<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
權限的應用程式所適用的規範。