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

启动BluetoothLeScanner扫描时应用崩溃无结果,触发空对象引用报错

解决BluetoothLeScanner启动扫描时的空指针崩溃问题

从你给出的错误信息来看,核心问题是**mBluetoothLeScanner对象为null时,你调用了它的startScan()方法**,触发了NullPointerException。错误发生在BleDevicesActivity.java的第91行,这说明你的蓝牙扫描器实例没有正确初始化。

下面是一步步的排查和修复方案:

1. 先确认设备是否支持BLE

有些旧设备不支持蓝牙低功耗(BLE),在初始化蓝牙相关组件前,先做个检查:

// 在Activity的onCreate方法中添加
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, "当前设备不支持BLE功能", Toast.LENGTH_LONG).show();
    finish(); // 不支持的话直接关闭页面
}

2. 确保蓝牙已正常开启

BluetoothLeScanner依赖于已开启的蓝牙Adapter,所以要先获取Adapter并检查蓝牙状态:

// 定义请求码,比如
private static final int REQUEST_ENABLE_BT = 1;

// 获取蓝牙管理器和Adapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

// 检查Adapter是否存在,以及蓝牙是否开启
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

之后在onActivityResult里处理蓝牙开启的结果,确保蓝牙开启后再初始化扫描器。

3. 正确初始化BluetoothLeScanner

只有当蓝牙Adapter有效且蓝牙已开启时,才能成功获取扫描器实例:

// 确保在蓝牙开启后执行这段代码
if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
    mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
}

如果这一步后mBluetoothLeScanner还是null,大概率是设备的BLE硬件有问题,但这种情况很少见,多数是前面的步骤没做对。

4. 检查权限是否齐全

Android系统对BLE扫描有严格的权限要求:

  • 在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
  • Android 6.0及以上需要动态申请位置权限(因为BLE扫描依赖位置服务):
private static final int REQUEST_LOCATION_PERMISSION = 2;

// 在初始化扫描前检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
            REQUEST_LOCATION_PERMISSION);
}

5. 调用startScan前做非空判断

最后,在你原来的startScanning()方法里,先检查扫描器是否有效,再调用扫描:

public void startScanning() {
    // 先判断扫描器是否初始化成功
    if (mBluetoothLeScanner == null) {
        Toast.makeText(this, "蓝牙扫描器初始化失败,请检查蓝牙状态", Toast.LENGTH_SHORT).show();
        return;
    }
    // 执行扫描
    mBluetoothLeScanner.startScan(buildScanFilters(), buildScanSettings(), mScanCallback);
}

按照以上步骤逐一排查,应该就能解决这个空指针崩溃的问题了。

内容的提问来源于stack exchange,提问作者diamantis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:56