某些Android 6.0设备上,adapter.getBluetoothLeScanner()返回null

6

我的应用与BLE设备配合使用,并通过以下方式(API 21+)搜索它们:

adapter.getBluetoothLeScanner().startScan(filters, scanSettings, this);

这个功能在大多数设备上(例如三星)表现得非常完美,但在一些安装了Android 6.0的LGE和HTC设备上返回null并崩溃:

由java.lang.NullPointerException引起:尝试调用空对象引用上的'void android.bluetooth.le.BluetoothLeScanner.startScan(java.util.List, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback)'方法。

该应用程序针对pre-marshmallow Android,因此权限已经被授予(应该已经被授予)。


2
如果蓝牙适配器被禁用,getBluetoothLeScanner将返回null。 - Ion Aalbers
很奇怪,因为我在一开始就启用了它:// 打开蓝牙 if (!adapter.isEnabled()) { logger.debug("启用BLE适配器"); adapter.enable(); } - 4ntoine
我假设您已经拥有了BLUETOOTH_ADMIN权限。并且您是否检查了enable()调用的返回值? - Ion Aalbers
是的,当然可以。它适用于大多数设备,无需更改代码。 - 4ntoine
4个回答

5
我认为你可以在adapter.enable()后立即调用startScan函数。因为BluetoothAdapter.enable()是一个异步调用,所以你可能会遇到NullPointer异常。你可以尝试注册广播接收器来接收BluetoothAdapter状态,例如下面的代码:
    private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                    BluetoothAdapter.ERROR);
            switch (state) {
                case BluetoothAdapter.STATE_OFF:
                    break;
                case BluetoothAdapter.STATE_TURNING_OFF:
                    break;
                case BluetoothAdapter.STATE_ON:
                    //to check if BluetoothAdapter is enable by your code
                    if(enableFlag){
                      adapter.getBluetoothLeScanner().startScan(filters, scanSettings, callBack);
                    }
                    break;
                case BluetoothAdapter.STATE_TURNING_ON:
                    break;
            }
        }
    }
};

"enableFlag" 是用来做什么的? - dekaru
只是一个标志,用于检查您的代码是否启用了蓝牙。 - Charlie Wang

2

您需要执行以下步骤启用蓝牙:

if (!mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }

我注意到如果设备上没有启用蓝牙,mBluetoothAdapter.getBluetoothLeScanner();将返回null。您可以通过运行上述代码来启用蓝牙,该代码会生成一个活动以允许用户启用它,或者用户可以进入他们的设置并打开蓝牙。


0

0
    fun startScan(filters: List<ScanFilter>) {
      val isAdapterEnabled = getBluetoothAdapter().isEnabled()
      if (!isScanRunning && isAdapterEnabled) {
          // some logick

          scanner = getBluetoothAdapter().bluetoothLeScanner
          scanner.startScan(filters, scanSettings, this)
      }
  }
    fun getBluetoothAdapter(): BluetoothAdapter {
      return Objects.requireNonNull(
          getBluetoothManager().adapter,
          "Cannot get BluetoothAdapter"
      )
  }
  fun getBluetoothManager(): BluetoothManager {
      return Objects.requireNonNull(
          context.getSystemService(Context.BLUETOOTH_SERVICE) as 
    BluetoothManager,
          "Cannot get BluetoothManager"
      )
  }

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
根据目前的写法,你的回答不太清楚。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接