盡可能減少權限要求

提升應用程式品質並確保使用者隱私,建議您盡量減少應用程式用到權限的情況。這有助於使用者探索及使用優質應用程式,為他們提供安全可靠的環境。

向使用者要求權限會導致使用者流程中斷,使用者也可能拒絕您的要求。此外,每次宣告新權限時,您都必須檢查應用程式要求和分享使用者資料的方式。部分權限和 API 涉及高度機密資訊,因此您必須在應用程式中揭露您要如何存取、收集、使用及分享資料。

有幾種替代方式可以盡量減少用到權限的情況:

  • 如果應用程式僅需要知道大概位置,請宣告可提供概略位置資訊,而非精確位置資訊的權限。
  • 呼叫 API,讓應用程式在不宣告權限的情況下執行所需功能。
  • 叫用特定意圖或事件處理常式來執行功能,而不宣告權限。
  • 系統針對不同的檔案作業提供內建合約,也支援自訂合約

如果必須宣告權限,請一律尊重使用者的決定,並提供將應用程式體驗優雅降級的方法。

本頁面列舉了幾個用途,說明在這些情況下,應用程式無須宣告權限即可順利運作。

顯示附近地點

應用程式可能需要知道使用者的概略位置。如要顯示附近餐廳這類位置辨識資訊,知道概略位置就很有幫助。

某些功能會需要裝置的概略位置。在這種情況,請根據應用程式需要位置辨識資訊的頻率,採取下列其中一種做法:

  • 如果應用程式經常需要位置資訊,請宣告 ACCESS_COARSE_LOCATION 權限。取得權限後,就能依據定位服務取得裝置的概略位置,詳情請參閱概略位置精確度的相關文件說明。
  • 如果應用程式並不常用到位置資訊或僅使用一次,不妨請使用者輸入地址或郵遞區號。

其他使用情況則需要裝置更精確的位置資訊。只有在這類情況下,才適合宣告 ACCESS_FINE_LOCATION 權限。

建立及存取檔案

Android 允許您建立和存取檔案,而且不必宣告任何與儲存空間或感應器相關的權限。

開啟媒體檔案

應用程式可能會讓使用者選擇相片和影片,當做訊息附件或個人資料相片等等。

如要支援這項功能,請使用相片挑選工具。相片挑選工具不需要任何執行階段權限就能運作。使用者運用相片挑選工具選取要提供給應用程式的相片或影片時,系統會針對與所選媒體檔案相關聯的 URI,授予暫時讀取權限。

如果應用程式需要存取媒體檔案,但不使用相片挑選工具,則無須宣告任何儲存空間權限:

開啟文件

應用程式可能會顯示使用者在該應用程式或其他應用程式中建立的文件,例如文字檔案。

在這種情況下,您只須為了舊版裝置相容性宣告 READ_EXTERNAL_STORAGE,並將 android:maxSdkVersion 設為 28

請根據建立文件的應用程式,執行下列任一操作:

拍照

使用者可能會使用系統預先安裝的相機應用程式,在您的應用程式中拍照。

在這種情況下,請勿宣告 CAMERA 權限,改為叫用 ACTION_IMAGE_CAPTURE 意圖動作即可。

錄製影片

使用者可能會使用系統預先安裝的相機應用程式,在您的應用程式中錄製影片。

在這種情況下,請勿宣告 CAMERA 權限,改為叫用 ACTION_VIDEO_CAPTURE 意圖動作即可。

找出執行應用程式執行個體的裝置

特定的應用程式執行個體會需要得知運行中的裝置。如應用程式有裝置專屬偏好設定或通訊 (例如電視裝置和穿戴式裝置的不同播放清單),這項功能就能派上用場。

在這種情況下,請勿直接存取裝置的 IMEI。實際上,搭載 Android 10 版本或以上的裝置也無法這麼做。建議改用下列方法:

  • 請使用執行個體 ID 程式庫,取得應用程式執行個體的不重複裝置 ID。
  • 請建立自己的識別碼,限定應用程式儲存空間。建立識別碼請使用基本系統函式,例如 randomUUID()

以藍牙配對裝置

應用程式可以透過藍牙轉移資料至其他裝置,進而提供更優質的使用體驗。

如要提供這項功能,請勿宣告 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIIONBLUETOOTH_ADMIN 權限。使用配對裝置的配對連線功能即可。

自動輸入付款卡號碼

Google Play 服務提供的程式庫可讓您自動輸入付款卡號碼。您不必宣告 CAMERA 權限,改用提供簽帳金融卡和信用卡識別功能的程式庫即可。

管理通話和簡訊

Android 和 Google Play 服務提供的程式庫可讓您管理通話和簡訊,無須宣告任何與通話或簡訊相關的權限。

自動輸入一次性密碼

為了簡化雙重驗證的工作流程,應用程式可能會自動輸入使用者裝置收到的一次性密碼,藉此驗證使用者身分。

如要在搭載 Google Play 服務的裝置上支援這項功能,您無須宣告 READ_SMS 權限,使用 SMS Retriever API 即可。

在其他裝置上,如果應用程式指定 Android 8.0 (API 級別 26) 以上版本,請使用 createAppSpecificSmsToken() 產生應用程式專屬權杖,然後將這個權杖傳遞給可傳送驗證簡訊的其他應用程式或服務。

自動輸入使用者電話號碼

為了促進銷售或支援服務的效率,應用程式可能會提供自動輸入裝置電話號碼的功能。

如要在搭載 Google Play 服務的裝置上支援這項功能,您無須宣告 READ_PHONE_STATE 權限,使用提供電話號碼提示功能的程式庫即可。

過濾來電

為了盡可能減少使用者受到干擾,應用程式可能會過濾不重要的來電。

如要支援這項功能,請勿宣告 READ_PHONE_STATE 權限。請改用 CallScreeningService API。

撥打電話

應用程式可能會輕觸聯絡人的資訊,以便撥打電話。

如要支援這項功能,請使用 ACTION_DIAL 意圖動作,而不是 ACTION_CALL 動作。ACTION_CALL 需要安裝期間權限 CALL_PHONE,防止應用程式安裝至無法撥打電話的裝置,例如某些平板電腦。

在應用程式中斷時暫停媒體活動

如果有來電或是使用者設定的鬧鐘響起,應用程式應暫停播放任何音訊媒體,直到應用程式再次成為使用者音訊焦點。

如要提供這項功能,請勿宣告 READ_PHONE_STATE 權限。請改為實作 onAudioFocusChange() 事件處理常式,在系統轉移音訊焦點時,此常式會自動執行。進一步瞭解如何導入音訊焦點

掃描條碼

Android 支援採用 Google Play 服務提供的 Google Code Scanner API,這個 API 可讓您在不聲明任何相機權限的情況下解碼條碼。此 API 有助於維護使用者隱私,並降低需為了條碼掃描用途建立自訂 UI 的可能性。

此 API 會掃描條碼,並只將掃描結果傳回至應用程式。系統會在裝置端處理圖片,Google 不會儲存任何資料或掃描結果。

如果應用程式需要支援複雜的用途或條碼格式,或需要自訂 UI,請改用 ML Kit 條碼掃描 API

重設未使用的權限

Android 提供多種將未使用的執行階段權限重設為預設拒絕狀態的方式:

請參閱設計指南

要求執行階段權限

評估應用程式需要宣告及要求的執行階段權限後,請按照特定工作流程操作。

請參閱設計指南

說明應用程式需要相關權限的原因

使用 requestPermissions() 時,系統會顯示對話方塊,指出應用程式想要使用的權限,但不會解釋原因,因此可能會導致使用者感到困惑。

如需進一步瞭解這個對話方塊的顯示方式、時機,以及相關建議,請參閱設計指南

處理權限要求遭拒的情況

在使用者選擇拒絕授權前後,應用程式應協助使用者瞭解拒絕授權會產生的影響。

請參閱設計指南