我正在尝试在android studio中创建一个室内定位服务应用程序。有一个扫描按钮可以开始发现BLE设备。当我单击扫描按钮时,应用程序崩溃。但是,当我重新打开该应用程序并再次单击“扫描”按钮时,它可以工作。
我尝试了这个方法,它来自stackoverflow的一个项目。
类变量:
<form action="http://example.com">
<input type="submit" onclick="alert('hello');return false;"/>
</form>
这是我的代码
private BluetoothAdapter mBtAdapter = null;
final BluetoothManager btManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBtAdapter = btManager.getAdapter();
if (mBtAdapter == null || !mBtAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
}
public void onScanButton(){
if (mBtAdapter.isEnabled()){
scanLeDevice(true);
}
}
logcat显示 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.bluetooth.le.BluetoothLeScanner.startScan(android.bluetooth.le.ScanCallback)'
在com.example.myapplication.MainActivity $ 6.run(MainActivity.java:137)
在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:245)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:641)
在java.lang.Thread.run(Thread.java:764)
答案 0 :(得分:0)
在我单击“扫描”按钮之前,将显示一个提示,要求您打开 在蓝牙上。因此蓝牙将被打开
您对此部分有误。您要求用户启用它,但可能尚未发生。至少您以后需要安装扫描仪。
当前,您在启动权限请求之前设置了扫描程序参考。
这也解释了为什么它在您的应用程序第一次崩溃后仍然可以工作,因为您第二次来到这里时,权限已启用。
来自BluetoothAdapter#getBluetoothLeScanner()
的Javadoc:
如果蓝牙关闭或蓝牙LE将返回null 此设备不支持广告。
您可以将代码更改为:
public void startScanning() {
btScanner = btAdapter.getBluetoothLeScanner();
if (btScanner == null) {
// not enabled yet or not supported
return;
}
System.out.println("start scanning");
peripheralTextView.setText("");
startScanningButton.setVisibility(View.INVISIBLE);
stopScanningButton.setVisibility(View.VISIBLE);
AsyncTask.execute(new Runnable() {
@Override
public void run() {
btScanner.startScan(leScanCallback);
}
});
}