调用Bluetooth.getDefaultAdapter触发警告是否会导致蓝牙数据交换失败?
问题排查与解决方案
1. 日志说明
你贴出的所有日志都不是导致数据交互失败的原因:
- 开头的
ViewRootImpl、Choreographer类日志均为安卓系统UI渲染的常规运行日志,和蓝牙功能无关 D/BluetoothAdapter开头的堆栈是系统调试级别的打印信息,仅用于记录BluetoothAdapter的实例化流程,不属于报错范畴
2. 蓝牙连接成功但无法交互数据的排查方向
- 权限校验缺失:Android 12及以上系统需要动态申请
BLUETOOTH_CONNECT权限,Android 12以下需要ACCESS_FINE_LOCATION权限,你当前代码完全没有权限校验逻辑,权限不足会导致即使能建立连接也无法读写数据 - 串口参数不匹配:HC-05默认波特率为9600,采用8位数据位、1位停止位、无校验的配置,如果安卓端打开蓝牙串口时的参数和HC-05实际配置不一致,会出现连接成功但无法正确收发数据的问题
- 读写逻辑线程错误:蓝牙流的读写操作不能在主线程执行,否则会被系统主线程阻塞策略拦截,导致数据发送失败,需要单独开启工作线程处理输入输出流的读写
- 缓冲区未刷新:写入数据后需要调用输出流的
flush()方法强制刷新缓冲区,否则数据会停留在本地缓冲区不会发送到HC-05
3. 现有代码优化方案
你当前贴出的SelectDeviceActivity仅实现了配对设备列表展示逻辑,首先需要补充权限校验逻辑,示例如下:
// 调用蓝牙相关逻辑前先校验权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { // 权限通过后再获取蓝牙适配器、读取配对设备列表 loadPairedDeviceList(); } }).launch(Manifest.permission.BLUETOOTH_CONNECT); return; } } else { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 101); return; } } // 把原有的加载配对设备的逻辑抽成单独方法 private void loadPairedDeviceList() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); List<Object> deviceList = new ArrayList<>(); for (BluetoothDevice device : pairedDevices){ String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); DeviceInfoModel deviceInfoModel = new DeviceInfoModel(deviceName,deviceHardwareAddress); deviceList.add(deviceInfoModel); } RecyclerView recyclerView = findViewById(R.id.deviceList); recyclerView.setLayoutManager(new LinearLayoutManager(this)); ListAdapter listAdapter = new ListAdapter(this,deviceList); recyclerView.setAdapter(listAdapter); }
同时需要在AndroidManifest.xml中添加对应权限声明:
<!-- 安卓12及以下蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <!-- 安卓12及以上蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-feature android:name="android.hardware.bluetooth" android:required="true" />
内容的提问来源于stack exchange,提问作者Aditya Madhav Nair
相关产品推荐
相关产品推荐

