請先評估應用程式是否需要此權限再行宣告。當使用者企圖執行的應用程式功能需要執行階段權限時,應用程式必須中斷使用者工作,並提出權限要求。使用者就必須抉擇。如果使用者不瞭解應用程式要求特定權限的原因,就可能會拒絕授權,甚至解除安裝應用程式。
此外,每次宣告新權限時,請務必檢查應用程式要求和分享使用者資料的方式。部分權限和 API 涉及高度機密資訊,因此您必須在應用程式中揭露您要如何存取、收集、使用及分享資料。
建議您考慮是否需要在一開始取得權限,或者能否採取其他做法支援應用程式功能。系統針對不同的檔案作業提供內建合約,也支援自訂合約。
如果必須宣告權限,請一律尊重使用者的決定,並提供將應用程式體驗優雅降級的方法。
本頁面列舉了幾個用途,說明在這些情況下,應用程式無須宣告權限即可順利運作。
顯示附近地點
應用程式可能需要知道使用者的概略位置。如要顯示附近餐廳這類位置辨識資訊,知道概略位置就很有幫助。
某些功能會需要裝置的概略位置。在這種情況,請根據應用程式需要位置辨識資訊的頻率,採取下列其中一種做法:
- 如果應用程式經常需要位置資訊,請宣告
ACCESS_COARSE_LOCATION
權限。取得權限後,就能依據定位服務取得裝置的概略位置,詳情請參閱概略位置精確度的相關文件說明。 - 如果應用程式並不常用到位置資訊或僅使用一次,不妨請使用者輸入地址或郵遞區號。
其他使用情況則需要裝置更精確的位置資訊。只有在這類情況下,才適合宣告 ACCESS_FINE_LOCATION
權限。
建立及存取檔案
Android 允許您建立和存取檔案,而且不必宣告任何與儲存空間或感應器相關的權限。
拍照
使用者可能會使用系統預先安裝的相機應用程式,在您的應用程式中拍照。
在這種情況下,請勿宣告 CAMERA
權限,而是叫用 ACTION_IMAGE_CAPTURE
意圖動作。
錄製影片
使用者可能會使用系統預先安裝的相機應用程式,在您的應用程式中錄製影片。
在這種情況下,請勿宣告 CAMERA
權限,叫用 ACTION_VIDEO_CAPTURE
意圖動作即可。
開啟媒體檔案
應用程式可能會讓使用者選擇相片和影片,當做訊息附件或個人資料相片等等。
如要支援這項功能,請使用相片挑選工具。相片挑選工具不需要任何執行階段權限就能運作。使用者運用相片挑選工具選取要提供給應用程式的相片或影片時,系統會針對與所選媒體檔案相關聯的 URI,授予暫時讀取權限。
如果應用程式需要存取媒體檔案,但不使用相片挑選工具,則無須宣告任何儲存空間權限:
- 如要存取的是應用程式建立的媒體檔案,應用程式本身便已具備媒體存放區檔案的存取權。
- 如要存取的是其他應用程式建立的媒體檔案,請使用儲存空間存取架構。
開啟文件
應用程式可能會顯示使用者在該應用程式或其他應用程式中建立的文件,例如文字檔案。
在這種情況下,您只須為了舊版裝置相容性宣告 READ_EXTERNAL_STORAGE
,並將 android:maxSdkVersion
設為 28
。
請根據建立文件的應用程式,執行下列任一操作:
- 如果使用者使用應用程式中建立文件,請直接存取文件。
- 如果使用者使用其他應用程式建立文件,請使用 Storage Access Framework。
找出執行應用程式執行個體的裝置
特定的應用程式執行個體會需要得知運行中的裝置。如應用程式有裝置專屬偏好設定或通訊 (例如電視裝置和穿戴式裝置的不同播放清單),這項功能就能派上用場。
在這種情況下,請勿直接存取裝置的 IMEI。實際上,搭載 Android 10 版本或以上的裝置也無法這麼做。建議改用下列方法:
- 請使用執行個體 ID 程式庫,取得應用程式執行個體的不重複裝置 ID。
- 請建立自己的識別碼,限定應用程式儲存空間。建立識別碼請使用基本系統函式,例如
randomUUID()
。
以藍牙配對裝置
應用程式可以透過藍牙轉移資料至其他裝置,進而提供更優質的使用體驗。
如要提供這項功能,請勿宣告 ACCESS_FINE_LOCATION
、ACCESS_COARSE_LOCATIION
或 BLUETOOTH_ADMIN
權限。使用配對裝置的配對連線功能即可。
自動輸入付款卡號碼
Google Play 服務提供的程式庫可讓您自動輸入付款卡號碼。您不必宣告 CAMERA
權限,使用提供簽帳金融卡和信用卡識別功能的程式庫即可。
在應用程式中斷時暫停媒體活動
如果有來電或是使用者設定的鬧鐘響起,應用程式應暫停播放任何音訊媒體,直到應用程式再次成為使用者音訊焦點。
如要提供這項功能,請勿宣告 READ_PHONE_STATE
權限。請改為實作 onAudioFocusChange()
事件處理常式,在系統轉移音訊焦點時,此常式會自動執行。進一步瞭解如何導入音訊焦點。
管理通話和簡訊
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
,防止應用程式安裝至無法撥打電話的裝置,例如某些平板電腦。