如 使用权限的工作流程 中所述,如果您的应用请求应用权限,则必须在应用的清单文件中声明这些权限。这些声明有助于应用商店和用户了解您的应用可能请求的权限集。
请求权限的过程取决于权限的类型
- 如果权限是 安装时权限,例如普通权限或签名权限,则在安装时自动授予该权限。
- 如果权限是 运行时权限 或 特殊权限,并且如果您的应用安装在运行 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(API 级别 29)或更高版本的设备上使用 READ_EXTERNAL_STORAGE
权限,只要您的应用以 Android 10 或更高版本为目标即可。但是,为了与旧版设备兼容,您可以声明 READ_EXTERNAL_STORAGE
权限并将 android:maxSdkVersion
设置为 28。