如权限使用工作流程所述,如果您的应用要请求应用权限,您必须在应用的清单文件中声明这些权限。这些声明可帮助应用商店和用户了解您的应用可能会请求的权限组合。
执行权限请求的过程取决于权限类型:
如果是安装时权限(例如普通权限或签名权限),系统会在安装您的应用时自动为其授予相应权限。
如果是运行时权限,并且您的应用安装在搭载 Android 6.0(API 级别 23)或更高版本的设备上,则您必须自己请求权限。
注意:请仔细考虑您要在应用清单中声明哪些权限。仅添加您的应用需要的权限。对于应用请求的每项权限,请确保它能为用户提供明确的好处,并且请求方式对用户来说清楚明晰。
向应用清单添加声明
如需声明应用可能请求的权限,请在应用的清单文件中添加相应的 元素。例如,需要访问相机的应用应在清单中添加以下代码行:
AndroidManifest.xml
...
将硬件声明为可选
某些权限(例如 CAMERA)可让您的应用访问只有部分 Android 设备具有的硬件组件。如果您的应用声明了这类硬件相关权限,请考虑您的应用在没有该硬件的设备上会不会完全无法运行。在大多数情况下,硬件是可选的,因此最好在 声明中将 android:required 设置为 false,从而将硬件声明为可选项,如以下代码段所示:
AndroidManifest.xml
...
android:required="false" />
注意:如果您未在 声明中将 android:required 设置为 false,则 Android 会假定您的应用必须在有该硬件的情况下才能运行。因此,系统会阻止某些设备安装您的应用。
确定硬件可用性
如果您将硬件声明为可选,您的应用在没有该硬件的设备上也可以运行。要检查设备是否具有特定的硬件,请使用 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 属性。
该属性表示设备搭载的系统版本高于 maxSdkVersion 时不需要特定权限。