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

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

本指南說明如何查看其他應用程式已宣告的權限組合。這份指南也會說明如何設定活動、服務、內容供應器和廣播接收器,以限制其他應用程式如何與您的應用程式互動。最後,此頁面還提供應用程式之間的其他互動模式。

查看其他應用程式的權限

如要查看其他應用程式所宣告的權限組合,請使用裝置或模擬器完成以下步驟:

  1. 請開啟應用程式的「應用程式資訊」(App info) 畫面。
  2. 請選取「權限」(Permissions)。系統會載入「應用程式權限」(App permissions) 畫面。

    這個畫面會顯示一組權限群組。系統會將應用程式宣告的權限組合整理成群組。

限制使用者與應用程式活動的互動

使用 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() 時可提供權限,以限制哪些廣播接收器可接收廣播。

請注意,廣播供應器和接收器都能請求權限。如果系統要將意圖傳送至 Associated Target,兩者都必須具備權限。詳情請參閱「限制具有權限的廣播」(Restricting broadcasts with permissions)

檢查權限的其他方式

以下方式也可以查看權限:

  • 在呼叫服務期間,將權限字串傳入 Context.checkCallingPermission()。這個方法會傳回一個整數,說明是否有權限進行當前的呼叫程序。請注意,只有在執行來自其他程序的呼叫時,才可以使用此方法,此方法通常是透過服務發布的 IDL 介面執行,或透過某些方式提供給另一項程序。
  • 如要確認其他程序是否已獲得特定權限,請將程序 (PID) 傳入 Context.checkPermission()
  • 如要確認其他套件是否已獲得特定權限,請將套件名稱傳入 PackageManager.checkPermission()