如「使用權限的工作流程」所述,如果您的應用程式要求應用程式權限,就必須在其應用程式的資訊清單檔案中宣告這些權限。這些宣告協助應用程式商店和使用者瞭解應用程式會要求的權限組合。
要求權限的程序取決於權限類型:
- 如果該權限為安裝期間權限,例如一般權限或簽名權限,系統會自動在安裝期間授予權限。
- 如果該權限為執行階段權限或特殊權限,且應用程式安裝在搭載 Android 6.0 (API 級別 23) 以上版本的裝置上,您必須自行要求執行階段權限或特殊權限。
新增宣告至應用程式資訊清單
如要宣告應用程式會要求的權限,請在應用程式資訊清單檔案中納入適當的 <uses-permission>
元素。舉例來說,應用程式如需存取相機,AndroidManifest.xml
中會有這一行:
<manifest ...> <uses-permission android:name="android.permission.CAMERA"/> <application ...> ... </application> </manifest>
宣告硬體為非必要元素
如有 CAMERA
這類權限,可讓應用程式存取僅部分 Android 裝置特有的硬體元件。如果應用程式宣告任何與硬體相關的權限,請考量應用程式在沒有該硬體的裝置上是否仍能執行。在大多數情況下,硬體為非必要元素,所以最好將 <uses-feature>
宣告中的 android:required
設為 false
,將硬體宣告為非必要元素,如 AndroidManifest.xml
檔案中的下列程式碼片段所示:
<manifest ...> <application> ... </application> <uses-feature android:name="android.hardware.camera" android:required="false" /> <manifest>
判斷硬體適用情況
如果將硬體宣告為非必要元素,則應用程序可以在沒有該硬體的裝置上執行。如要檢查裝置是否具有特定硬體,請使用 hasSystemFeature()
方法,如下列程式碼片段所示。如果該硬體不適用,請在應用程式中妥善停用該功能。
Kotlin
// Check whether your app is running on a device that has a front-facing camera. if (applicationContext.packageManager.hasSystemFeature( PackageManager.FEATURE_CAMERA_FRONT)) { // Continue with the part of your app's workflow that requires a // front-facing camera. } else { // Gracefully degrade your app experience. }
Java
// Check whether your app is running on a device that has a front-facing camera. if (getApplicationContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FRONT)) { // Continue with the part of your app's workflow that requires a // front-facing camera. } else { // Gracefully degrade your app experience. }
依 API 級別宣告權限
如要僅在支援執行階段權限的裝置 (即搭載 Android 6.0 (API 級別 23) 或更高版本的裝置) 上聲明權限,請納入 <uses-permission-sdk-23>
元素,而非 <uses-permission>
。
使用上述任一元素時,您可以設定 maxSdkVersion
屬性,表明如果裝置搭載的 Android 版本高於指定值,則不需要特定權限。如此一來,您就可以免除不必要的權限,同時為舊裝置提供相容性。
舉例來說,應用程式可能會顯示使用者在應用程式中建立的相片或影片等媒體內容。在此情況下,只要應用程式目標版本是 Android 10 以上版本,在搭載 Android 10 (API 級別 29) 以上版本的裝置中,就不必使用 READ_EXTERNAL_STORAGE
權限。不過,如要與舊版裝置相容,您可以宣告 READ_EXTERNAL_STORAGE
權限,並將 android:maxSdkVersion
設為 28。