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

时间:2016-01-19 13:28:04

标签: android bluetooth-lowenergy

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

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

它适用于大多数设备(例如三星),但在某些LGE和HTC设备(使用Android 6.0)上返回null并崩溃:

  

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

该应用程序的目标是pre-marshmallow android,因此提交的内容已经(应该)授予。

3 个答案:

答案 0 :(得分:3)

我认为您可以在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;
            }
        }
    }
};

答案 1 :(得分:2)

您需要通过以下方式启用蓝牙:

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

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

答案 2 :(得分:0)

自Android 6.0起,您的应用必须拥有访问BT适配器的新权限: Android 6.0 - Access to Hardware Identifier。 从Android 6.0开始,需要在运行时请求权限,而不是在应用安装期间请求权限:Android 6.0 - Requesting Permissions at Run Time