声明应用权限

使用权限的工作流程中所述,如果您的应用请求应用权限,则必须在应用的清单文件中声明这些权限。这些声明有助于应用商店和用户了解您的应用可能请求的权限集。

请求权限的过程取决于权限的类型

将声明添加到应用清单

要声明您的应用可能请求的权限,请在应用的清单文件中包含适当的 <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。