要求特殊權限

特殊權限可保護特別敏感或與使用者隱私沒有直接關聯的系統資源存取權。這類權限與安裝期間權限執行階段權限不同。

圖 1:系統設定中的「特殊應用程式存取權」畫面。

以下列舉一些特殊權限的例子:

  • 排定確切的鬧鐘時間。
  • 在其他應用程式上層顯示及繪製內容。
  • 存取所有儲存空間資料。

宣告特殊權限的應用程式會顯示在系統設定中的「特殊應用程式存取權」頁面中 (圖 1)。如要授予應用程式特殊權限,使用者必須依序前往以下頁面:「設定」>「應用程式」>「特殊應用程式存取權」

工作流程

如要要求特殊權限,請執行下列步驟:

  1. 在應用程式的資訊清單檔案中,宣告應用程式可能需要要求的特殊權限
  2. 設計應用程式專屬的使用者體驗,藉此讓應用程式中的特定動作與特定特殊權限建立關聯。讓使用者知道哪些動作可能會要求他們授予應用程式存取使用者私人資料的權限。
  3. 等待使用者在應用程式中叫用需要存取特定使用者私人資料的工作或動作。屆時,您的應用程式就能要求存取這些資料所需的特殊權限。
  4. 檢查使用者是否已授予應用程式所需的特殊權限,方法是使用各項權限的自訂檢查函式。如果已獲授予權限,應用程式就能存取使用者私人資料。否則,請繼續進行下一個步驟。注意:每次執行需要該項權限的作業時,您都必須檢查是否擁有權限。
  5. 利用 UI 元素向使用者解釋原因,清楚說明應用程式要存取哪些資料,以及使用者授予特殊權限後,應用程式能提供什麼好處。此外,由於應用程式會將使用者帶往系統設定授予權限,因此也建議提供簡要操作說明,引導使用者在該頁面授予權限。說明原因的使用者介面應提供明確選項,讓使用者能選擇不授予權限。使用者確認原因後,請繼續進行下一個步驟。
  6. 要求特殊權限,應用程式必須取得這項權限才能存取使用者私人資料。這可能涉及前往系統設定中對應頁面的意圖,讓使用者能在該處授予權限。與執行階段權限不同,系統不會顯示彈出式權限對話方塊。
  7. 透過 onResume() 方法檢查使用者的回應,看他們選擇授予或拒絕特殊權限。
  8. 如果使用者已授予應用程式權限,您就可以存取使用者私人資料。如果使用者拒絕權限要求,請為應用程式體驗進行優雅降級,這樣一來,即使沒有受到該項權限保護的相關資訊,應用程式也能為使用者執行功能。
圖 2:在 Android 上宣告及要求特殊權限的工作流程。

要求特殊權限

執行階段權限不同,使用者必須在系統設定中,透過「特殊應用程式存取權」頁面授予特殊權限。應用程式可使用意圖將使用者帶往該頁面,這樣會暫停應用程式,並啟動特定特殊權限的對應設定頁面。使用者返回應用程式後,應用程式可以利用 onResume() 函式檢查是否已獲授予權限。

以下程式碼範例說明如何向使用者要求 SCHEDULE_EXACT_ALARMS 特殊權限:

val alarmManager = getSystemService<AlarmManager>()!!
when {
   // if permission is granted, proceed with scheduling exact alarms…
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // ask users to grant the permission in the corresponding settings page
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

用於檢查權限及處理使用者決定的 onResume() 程式碼範例:

override fun onResume() {
   // ...

   if (alarmManager.canScheduleExactAlarms()) {
       // proceed with the action (setting exact alarms)
       alarmManager.setExact(...)
   }
   else {
       // permission not yet approved. Display user notice and gracefully degrade
       your app experience.
       alarmManager.setWindow(...)
   }
}

最佳做法和訣竅

以下各節將提供要求特殊權限的最佳做法和注意事項。

每項權限都有專屬的檢查方法

特殊權限的運作方式與執行階段權限不同。請改為參閱權限 API 參考資料頁面,並針對每項特殊權限使用自訂存取權檢查函式。例如,針對 SCHEDULE_EXACT_ALARMS 權限使用 AlarmManager#canScheduleExactAlarms(),針對 MANAGE_EXTERNAL_STORAGE 權限則使用 Environment#isExternalStorageManager()

在情境中要求權限

與執行階段權限相似,應用程式應在使用者要求執行需要特殊權限的特定動作時,在情境中要求該項權限。例如,等待使用者安排在特定時間傳送電子郵件時,才要求 SCHEDULE_EXACT_ALARMS 權限。

說明要求

先提供要求權限的原因,再重新導向至系統設定。由於使用者會暫時離開應用程式來授予特殊權限,因此請先在應用程式內顯示相關使用者介面再啟動意圖,將使用者帶往系統設定中的「特殊應用程式存取權」頁面。這個使用者介面須清楚說明應用程式需要該項權限的原因,以及使用者應如何在設定頁面中授予權限。