權限不只用於要求系統功能。還可以限制其他應用程式與您的應用程式元件互動的方式。
本指南說明如何檢查其他應用程式已宣告的權限組合。本指南也會說明如何設定活動、服務、內容供應器和廣播接收器,以限制其他應用程式與您的應用程式互動的方式。
檢查其他應用程式的權限
如要檢視另一個應用程式所宣告的權限組合,請使用裝置或模擬器完成以下步驟:
- 請開啟應用程式的「App info」(應用程式資訊) 畫面。
選取「Permissions」。系統會載入「App permissions」(應用程式權限) 畫面。
此畫面會顯示權限群組組合。系統會將應用程式已宣告的權限組合整理至這些群組。
以下有多種可以查看權限的方式:
- 在呼叫服務期間,將權限字串傳入
Context.checkCallingPermission()
。這個方法會傳回一個整數,說明是否有權限進行目前的呼叫程序。請注意,只有在執行來自其他程序的呼叫時,才可以使用此方法,此方法通常是透過服務發布的 IDL 介面執行,或透過某些方式提供給另一項程序。 - 如要確認其他程序是否已獲得特定權限,請將程序 (PID) 傳入
Context.checkPermission()
。 - 如要確認其他套件是否已獲得特定權限,請將套件名稱傳入
PackageManager.checkPermission()
。
限制與應用程式活動的互動
使用 android:permission
屬性為資訊清單中的 <activity>
標記,限制哪些其他應用程式可以啟動該 Activity
。進行 Context.startActivity()
和 Activity.startActivityForResult()
期間,會檢查這項權限。如果呼叫端不具備必要權限,則會發生 SecurityException
。
限制與應用程式服務的互動
使用 android:permission
屬性為資訊清單中的 <service>
標記,限制哪些其他應用程式可以啟動或繫結至相關聯的 Service
。進行 Context.startService()
、Context.stopService()
和 Context.bindService()
期間,會檢查這項權限。如果呼叫者不具備必要權限,則會發生 SecurityException
。
限制與應用程式內容供應器的互動
使用 android:permission
屬性為 <provider>
標記,以限制哪些其他應用程式能存取 ContentProvider
中的資料。(內容供應器具有可供使用的額外重要安全性工具,其稱為 URI 權限,詳情請見下一節。)有別於其他元件,您可為內容供應器設定兩個不同的權限屬性:android:readPermission
限制哪些應用程式可從供應器讀取,android:writePermission
限制哪些應用程式可以寫入資料。請注意,如果供應器同時受讀取和寫入權限保護,僅擁有寫入權限不允許應用程式讀取供應器。
初次擷取供應器和應用程式在供應器上執行作業時,系統會檢查權限。如果要求的應用程式不具備任何權限,就會發生 SecurityException
。使用 ContentResolver.query()
需要擁有讀取權限;使用 ContentResolver.insert()
、ContentResolver.update()
或 ContentResolver.delete()
則需要寫入權限。以上情況如未擁有必要權限,就會導致 SecurityException
。
根據個別 URI 授予存取權
系統提供開發人員精細的控管功能,以掌控其他應用程式存取您應用程式內容供應器的方式。特別是,內容供應器可以透過讀取和寫入權限自我保護,同時讓其直接客戶與其他應用程式共用特定 URI。如要宣告應用程式支援此模型,請使用 android:grantUriPermissions
屬性或 <grant-uri-permission>
元素。
您也可以根據個別 URI 逐一授權。開始活動或將結果傳回活動時,請設定 Intent.FLAG_GRANT_READ_URI_PERMISSION
意圖標記、Intent.FLAG_GRANT_WRITE_URI_PERMISSION
意圖標記或兩者皆標記。這會授予其他應用程式讀取、寫入或讀取/寫入的權限,適用於意圖中的資料 URI。一般而言,無論其他應用程是否有權存取內容供應器中的資料,其他應用程式對於特定 URI 都會取得這些權限。
舉例來說,假設使用者使用您的應用程式檢視含有圖片附件的電子郵件。其他應用程式通常應無法存取郵件內容,但可能會需要檢視圖片。您的應用程式可使用意圖和 Intent.FLAG_GRANT_READ_URI_PERMISSION
意圖旗標,讓圖片檢視應用程式查看圖片。
還應考量應用程式的瀏覽權限。如果您的應用程式以 Android 11 (API 級別 30) 或以上版本為目標,系統會自動向您的應用程式顯示部分應用程式,但其他程式會預設隱藏。如果您的應用程式有內容供應器,也已授予其他應用程式 URI 權限,您的應用程式就會自動顯示給其他應用程式看到。
詳情請參閱 grantUriPermission()
、revokeUriPermission()
和 checkUriPermission()
方法的參考資源。
限制與應用程式廣播接收器的互動
使用 android:permission
屬性為 <receiver>
標記,以便限制哪些應用程式可將廣播傳送至相關聯的 BroadcastReceiver
。在系統嘗試傳遞已提交的廣播給指定接收器時,系統會在 Context.sendBroadcast()
傳回後檢查權限。這表示權限失敗並不會導致例外狀況被擲回呼叫端,只是不會傳遞 Intent
。
同樣也可向 Context.registerReceiver()
提供權限,藉此控管哪些應用程式可向程式輔助註冊的接收器廣播。另外,您也可以在呼叫 Context.sendBroadcast()
時提供權限,限制哪些廣播接收器可接收廣播。
請注意,接收器和電視台都能請求權限。發生這種情況時,兩種權限檢查都必須通過才能將意圖傳遞給關聯的目標。詳情請參閱「限制具有權限的廣播」。