Java蓝牙设备发现代码无输出问题排查求助
蓝牙设备发现问题排查建议
补充缺失的权限检查与声明
Android 12(API 31)及以上版本,蓝牙扫描必须申请BLUETOOTH_SCAN权限,获取设备名称、MAC地址等信息需要BLUETOOTH_CONNECT权限;API 30及以下版本还需ACCESS_FINE_LOCATION权限才能扫描设备。- 先确认Manifest里已声明必要权限:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 适配API 30及以下 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth" android:required="true" /> - 代码中主动检查
BLUETOOTH_SCAN权限,手动授权不代表代码能正确感知:private static final int REQUEST_BLUETOOTH_PERM = 100; // 在按钮点击或初始化时检查 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_BLUETOOTH_PERM); return; }
- 先确认Manifest里已声明必要权限:
调整广播注册时机
当前代码在点击按钮后才注册广播再启动扫描,容易错过扫描初期的设备发现事件。建议在onCreate里提前注册广播,onDestroy时注销避免内存泄漏:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 提前注册广播接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); // 其他初始化操作 } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); }给已配对设备添加日志输出
discover_devices方法里只获取了已配对设备信息但没打印日志,加个Log语句确认这部分逻辑是否正常:for (BluetoothDevice device : pairedDevices) { String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); Log.d("PAIRED_DEVICES", "已配对设备:" + deviceName + " | MAC:" + deviceHardwareAddress); }验证扫描是否成功启动
startDiscovery会返回布尔值,通过它判断扫描是否正常启动:boolean scanStarted = myBluetoothAdapter.startDiscovery(); if (!scanStarted) { Log.e("BLUETOOTH", "扫描启动失败,请检查蓝牙是否开启、权限是否齐全"); }检查蓝牙适配器状态
确保设备支持蓝牙且功能已开启:if (myBluetoothAdapter == null) { Log.e("BLUETOOTH", "当前设备不支持蓝牙"); return; } if (!myBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 101); }修正广播接收器的权限检查上下文
把广播接收器里的getApplicationContext()换成当前Activity的上下文,避免权限检查出现异常:if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { return; }
内容的提问来源于stack exchange,提问作者SemirAdam
相关产品推荐
相关产品推荐

