tonutils-go核心功能解析:ADNL协议与RLDP通信实战教程
RxAndroidBle权限管理完全指南适配Android 6.0到12.0的权限策略【免费下载链接】RxAndroidBleAn Android Bluetooth Low Energy (BLE) Library with RxJava3 interface项目地址: https://gitcode.com/gh_mirrors/rx/RxAndroidBle想要在Android应用中成功使用蓝牙低功耗(BLE)功能权限管理是关键RxAndroidBle作为Android BLE开发的响应式编程库提供了完整的权限管理解决方案帮助开发者轻松应对从Android 6.0到12.0的复杂权限要求。本指南将详细介绍如何正确配置和使用RxAndroidBle的权限系统确保你的应用在不同Android版本上都能正常运行。 Android BLE权限演变历程Android系统的BLE权限要求随着版本更新发生了显著变化RxAndroidBle通过智能检测机制自动适配这些变化Android 5.1及以下只需要声明权限无需运行时请求Android 6.0-9.0需要ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限Android 10.0-11.0仅需要ACCESS_FINE_LOCATION权限Android 12.0需要BLUETOOTH_SCAN权限并可选择添加ACCESS_FINE_LOCATIONRxAndroidBle库的标志专为Android蓝牙低功耗开发设计 权限配置与声明AndroidManifest.xml配置在rxandroidble/src/main/AndroidManifest.xml中RxAndroidBle已经为你配置好了所有必要的权限声明!-- API 18-30 需要的基础蓝牙权限 -- uses-permission android:nameandroid.permission.BLUETOOTH android:maxSdkVersion30 / uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN android:maxSdkVersion30 / !-- API 23-30 需要的位置权限 -- uses-permission-sdk-23 android:nameandroid.permission.ACCESS_COARSE_LOCATION / uses-permission-sdk-23 android:nameandroid.permission.ACCESS_FINE_LOCATION / !-- API 31 需要的新权限 -- uses-permission android:nameandroid.permission.BLUETOOTH_CONNECT / uses-permission android:nameandroid.permission.BLUETOOTH_SCAN android:usesPermissionFlagsneverForLocation /权限智能适配机制RxAndroidBle的核心权限逻辑在ClientComponent.java中实现通过provideRecommendedScanRuntimePermissionNames()方法根据设备SDK版本动态返回所需的权限数组// 扫描权限适配逻辑 if (sdkVersion 23) { // Android 6.0之前无需运行时权限 return new String[][]{}; } else if (sdkVersion 29) { // Android 6.0-9.0ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION return new String[][]{{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}}; } else if (sdkVersion 31) { // Android 10.0-11.0仅需要ACCESS_FINE_LOCATION return new String[][]{{Manifest.permission.ACCESS_FINE_LOCATION}}; } else { // Android 12.0BLUETOOTH_SCAN可能还需要ACCESS_FINE_LOCATION if (isNearbyServicesNeverForLocation) { return new String[][]{{Manifest.permission.BLUETOOTH_SCAN}}; } return new String[][]{{Manifest.permission.BLUETOOTH_SCAN}, {Manifest.permission.ACCESS_FINE_LOCATION}}; } 实战扫描权限请求流程1. 检查权限状态在开始扫描前首先检查权限是否已授予RxBleClient rxBleClient RxBleClient.create(context); if (rxBleClient.isScanRuntimePermissionGranted()) { // 权限已授予开始扫描 startBleScan(); } else { // 请求权限 requestScanPermission(); }2. 请求权限使用RxAndroidBle提供的推荐权限列表进行请求public static void requestScanPermission(final Activity activity, final RxBleClient client) { ActivityCompat.requestPermissions( activity, // 获取当前Android版本需要的权限 new String[]{client.getRecommendedScanRuntimePermissions()[0]}, REQUEST_PERMISSION_BLE_SCAN ); }3. 处理权限结果在onRequestPermissionsResult中处理权限请求结果Override public void onRequestPermissionsResult(final int requestCode, NonNull final String[] permissions, NonNull final int[] grantResults) { if (ScanPermission.isScanPermissionGranted(requestCode, permissions, grantResults, rxBleClient)) { // 权限已授予开始扫描 startBleScan(); } else { // 权限被拒绝显示说明 showPermissionDeniedMessage(); } } 连接权限管理Android 12.0的连接权限从Android 12.0开始连接BLE设备也需要运行时权限。RxAndroidBle在ClientComponent.java中提供了相应的适配逻辑static String[][] provideRecommendedConnectRuntimePermissionNames( int deviceSdk, int targetSdk) { int sdkVersion Math.min(deviceSdk, targetSdk); if (sdkVersion 31 /* pre Android 12 */) { // Android 12.0之前连接不需要运行时权限 return new String[][]{}; } return new String[][]{{Manifest.permission.BLUETOOTH_CONNECT}}; }连接权限检查在建立连接前检查权限public void connectToDevice(RxBleDevice device) { if (rxBleClient.isConnectRuntimePermissionGranted()) { // 权限已授予开始连接 device.establishConnection(false).subscribe(connection - { // 处理连接 }); } else { // 请求连接权限 requestConnectPermission(); } } 权限检查工具类RxAndroidBle提供了完整的权限检查工具链CheckerPermission类在rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/util/CheckerPermission.java中实现了基础的权限检查逻辑public class CheckerPermission { private boolean isPermissionGranted(String permission) { if (grantedPermissions.contains(permission)) { return true; } boolean isGranted context.checkPermission(permission, Process.myPid(), Process.myUid()) PackageManager.PERMISSION_GRANTED; if (isGranted) { grantedPermissions.add(permission); } return isGranted; } }CheckerScanPermission类在rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/util/CheckerScanPermission.java中实现了扫描权限检查public class CheckerScanPermission { public boolean isScanRuntimePermissionGranted() { boolean allNeededPermissionsGranted true; for (String[] neededPermissions : scanPermissions) { allNeededPermissionsGranted checkerPermission.isAnyPermissionGranted(neededPermissions); } return allNeededPermissionsGranted; } } 最佳实践与常见问题1. 权限请求时机按需请求在用户执行需要权限的操作时请求权限解释原因向用户解释为什么需要该权限优雅降级权限被拒绝时提供替代方案2. Android 12.0的neverForLocation标志在Android 12.0中可以在BLUETOOTH_SCAN权限中添加neverForLocation标志避免同时请求位置权限uses-permission android:nameandroid.permission.BLUETOOTH_SCAN android:usesPermissionFlagsneverForLocation /3. 处理权限拒绝当用户拒绝权限时提供清晰的指引private void handlePermissionDenied() { if (shouldShowRequestPermissionRationale(permission)) { // 解释为什么需要权限 showPermissionRationaleDialog(); } else { // 用户永久拒绝引导到设置页面 showGoToSettingsDialog(); } } 示例代码参考完整的权限处理示例可以参考sample/src/main/java/com/polidea/rxandroidble2/sample/example1_scanning/ScanActivity.javaOnClick(R.id.scan_toggle_btn) public void onScanToggleClick() { if (isScanning()) { scanDisposable.dispose(); } else { if (rxBleClient.isScanRuntimePermissionGranted()) { scanBleDevices(); } else { hasClickedScan true; ScanPermission.requestScanPermission(this, rxBleClient); } } updateButtonUIState(); } 总结RxAndroidBle的权限管理系统为开发者提供了完整的解决方案自动适配从Android 6.0到12.0的权限要求。通过合理使用isScanRuntimePermissionGranted()、getRecommendedScanRuntimePermissions()等方法你可以轻松构建兼容不同Android版本的BLE应用。记住关键点动态适配RxAndroidBle自动检测Android版本并返回正确的权限要求最小权限只在需要时才请求权限遵循最小权限原则用户体验权限被拒绝时提供清晰的指引和替代方案未来兼容关注Android权限政策的变化及时更新应用通过遵循本指南你可以确保你的BLE应用在所有Android版本上都能正常运行为用户提供流畅的蓝牙体验【免费下载链接】RxAndroidBleAn Android Bluetooth Low Energy (BLE) Library with RxJava3 interface项目地址: https://gitcode.com/gh_mirrors/rx/RxAndroidBle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考