我的应用程序与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,因此提交的内容已经(应该)授予。
答案 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。