首次单击扫描按钮后,应用程序崩溃,但重新打开后该应用程序可以工作

时间:2019-07-10 07:33:56

标签: java android

我正在尝试在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)

1 个答案:

答案 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);
            }
        });
    }