news 2026/8/8 19:00:12

tonutils-go核心功能解析:ADNL协议与RLDP通信实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_LOCATIONACCESS_FINE_LOCATION权限
  • Android 10.0-11.0:仅需要ACCESS_FINE_LOCATION权限
  • Android 12.0+:需要BLUETOOTH_SCAN权限,并可选择添加ACCESS_FINE_LOCATION

RxAndroidBle库的标志,专为Android蓝牙低功耗开发设计

🔧 权限配置与声明

AndroidManifest.xml配置

rxandroidble/src/main/AndroidManifest.xml中,RxAndroidBle已经为你配置好了所有必要的权限声明:

<!-- API 18-30 需要的基础蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- API 23-30 需要的位置权限 --> <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- API 31+ 需要的新权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />

权限智能适配机制

RxAndroidBle的核心权限逻辑在ClientComponent.java中实现,通过provideRecommendedScanRuntimePermissionNames()方法根据设备SDK版本动态返回所需的权限数组:

// 扫描权限适配逻辑 if (sdkVersion < 23) { // Android 6.0之前无需运行时权限 return new String[][]{}; } else if (sdkVersion < 29) { // Android 6.0-9.0:ACCESS_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.0+:BLUETOOTH_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:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />

3. 处理权限拒绝

当用户拒绝权限时,提供清晰的指引:

private void handlePermissionDenied() { if (shouldShowRequestPermissionRationale(permission)) { // 解释为什么需要权限 showPermissionRationaleDialog(); } else { // 用户永久拒绝,引导到设置页面 showGoToSettingsDialog(); } }

📝 示例代码参考

完整的权限处理示例可以参考sample/src/main/java/com/polidea/rxandroidble2/sample/example1_scanning/ScanActivity.java

@OnClick(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应用。

记住关键点:

  1. 动态适配:RxAndroidBle自动检测Android版本并返回正确的权限要求
  2. 最小权限:只在需要时才请求权限,遵循最小权限原则
  3. 用户体验:权限被拒绝时提供清晰的指引和替代方案
  4. 未来兼容:关注Android权限政策的变化,及时更新应用

通过遵循本指南,你可以确保你的BLE应用在所有Android版本上都能正常运行,为用户提供流畅的蓝牙体验!

【免费下载链接】RxAndroidBleAn Android Bluetooth Low Energy (BLE) Library with RxJava3 interface项目地址: https://gitcode.com/gh_mirrors/rx/RxAndroidBle

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 18:59:40

Sonic高级功能: pitch调整与WSOLA算法的实战应用

FengNiao实战教程&#xff1a;5个步骤彻底清理iOS项目未使用图片资源 【免费下载链接】FengNiao A command line tool for cleaning unused resources in Xcode. 项目地址: https://gitcode.com/gh_mirrors/fe/FengNiao 在iOS开发过程中&#xff0c;随着项目迭代和功能演…

作者头像 李华
网站建设 2026/8/8 18:58:13

如何快速集成开源指纹识别库:面向开发者的完整指南

如何快速集成开源指纹识别库&#xff1a;面向开发者的完整指南 【免费下载链接】FingerJetFXOSE Fingerprint Feature Extractor; the initial contribution by DigitalPersona is MINEX Compliant (SDK 3F). 项目地址: https://gitcode.com/gh_mirrors/fi/FingerJetFXOSE …

作者头像 李华
网站建设 2026/8/8 18:56:58

AI Agent工具调用可靠性工程实践:从架构设计到故障恢复

1. 项目概述&#xff1a;当AI Agent开始“掉链子”最近半年&#xff0c;我和团队在多个生产环境中部署了AI Agent&#xff0c;从简单的客服机器人到复杂的自动化工作流编排器。最初的兴奋很快被一个现实问题冲淡&#xff1a;这些Agent在工具调用环节&#xff0c;时不时会“掉链…

作者头像 李华
网站建设 2026/8/8 18:48:40

GitHub热榜玄学现场:排名第一,涨星却干不过第三名

文章目录1 今天的榜单有多反常1.1 榜首干不过第三名的增量1.2 前四里塞了俩技能仓库2 Agent圈现在卷到哪一步了2.1 技能从附加项变成核心竞争力2.2 持续运行的底座三件套凑齐了3 看榜单别被排名骗了3.1 高增长项目集体往后排3.2 老项目回榜别硬凑趋势4 这几个项目值得多瞅两眼4…

作者头像 李华
网站建设 2026/8/8 18:45:13

终极Windows界面定制指南:用ExplorerPatcher简单恢复经典体验

终极Windows界面定制指南&#xff1a;用ExplorerPatcher简单恢复经典体验 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 你是否怀念Windows 1…

作者头像 李华