如需在应用中使用蓝牙功能,您必须声明多项权限。您还应指定应用是否需要支持传统蓝牙或低功耗蓝牙 (BLE)。如果您的应用不需要传统蓝牙或 BLE,但仍可受益于这些技术,则可以在运行时检查可用性。
声明权限
您在应用中声明的权限集取决于应用的目标 SDK 版本。
以 Android 12 或更高版本为目标平台
注意 :在 Android 8.0(API 级别 26)及更高版本中,与本部分介绍的权限相比,配套设备管理器 (CDM) 提供了一种更精简的方法来连接到配套设备。CDM 系统会代表您的应用提供配对界面,并且不需要位置权限。
如果您想要更好地控制配对和连接体验,请使用本部分中介绍的权限。
如果您的应用以 Android 12(API 级别 31)或更高版本为目标平台,请在应用的清单文件中声明以下权限:
- 如果您的应用查找蓝牙设备(如 BLE 外围设备),请声明
BLUETOOTH_SCAN权限。 - 如果您的应用使当前设备可被其他蓝牙设备检测到,请声明
BLUETOOTH_ADVERTISE权限。 - 如果您的应用与已配对的蓝牙设备通信,请声明
BLUETOOTH_CONNECT权限。 - 对于旧版蓝牙相关的权限声明,请将
android:maxSdkVersion设为 30。此应用兼容性步骤有助于系统仅向您的应用授予在搭载 Android 12 或更高版本的设备上安装时所需的蓝牙权限。 - 如果您的应用使用蓝牙扫描结果来推导物理位置,请声明
ACCESS_FINE_LOCATION权限。否则,您可以坚定地断言您的应用不会推导物理位置,并将ACCESS_FINE_LOCATION权限的android:maxSdkVersion设置为 30。
BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT 和 BLUETOOTH_SCAN 权限是运行时权限。因此,您必须先在应用中明确请求用户批准,然后才能查找蓝牙设备、使某个设备可被其他设备检测到,或者与已配对的蓝牙设备通信。当您的应用请求其中至少一项权限时,系统会提示用户允许您的应用访问附近的设备,如图 1 所示。
以下代码段演示了如何声明应用中与蓝牙相关的权限(如果应用以 Android 12 或更高版本为目标平台):
<manifest>
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!-- Needed only if your app looks for Bluetooth devices.
If your app doesn't use Bluetooth scan results to derive physical
location information, you can
<a href="#assert-never-for-location">strongly assert that your app
doesn't derive physical location</a>. -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- Needed only if