限制與其他應用程式的互動

權限不只用於要求系統功能。還可以限制其他應用程式與您的應用程式元件互動的方式。

本指南說明如何檢查其他應用程式已宣告的權限組合。本指南也會說明如何設定活動、服務、內容供應器和廣播接收器,以限制其他應用程式與您的應用程式互動的方式。

檢查其他應用程式的權限

如要檢視另一個應用程式所宣告的權限組合,請使用裝置或模擬器完成以下步驟:

  1. 請開啟應用程式的「App info」(應用程式資訊) 畫面。
  2. 選取「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() 時提供權限,限制哪些廣播接收器可接收廣播。

請注意,接收器和電視台都能請求權限。發生這種情況時,兩種權限檢查都必須通過才能將意圖傳遞給關聯的目標。詳情請參閱「限制具有權限的廣播」。