You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:09:03