安卓蓝牙应用在安卓棒棒糖系统中如果关闭蓝牙会崩溃

3

你好,我正在尝试扫描Android Lollipop的蓝牙BLE设备。它工作得很好,但如果关闭蓝牙然后运行应用程序,它将崩溃,然后弹出要求启用蓝牙的弹窗。理想情况下,如果蓝牙被关闭,它应该弹出要求启用蓝牙的弹窗。

这是应该启用蓝牙的方法:

   private void enableBluetooth() { 
   if(bluetoothAdapter == null) {
     //bluetoothState.setText("Bluetooth NOT supported"); } 
   else if(!bluetoothAdapter.isEnabled()) {
     //bluetoothAdapter.enable(); 
     Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     activity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
     } 
   }

开始扫描的代码

public void handleScanStart(View view) {
        foundDevices.clear();
        btArrayAdapter.clear();
        ble.startBleScan();
        scanButton.setEnabled(false);
       stopScanButton.setEnabled(true);
}

启用开始扫描
  public void startBleScan() {
        if(getScanning()) {
           return;
       }

          enableBluetooth();
         scanning = true;


         ScanFilter.Builder filterBuilder = new ScanFilter.Builder();                     //TODO currently default, scans all devices
        ScanSettings.Builder settingsBuilder = new               ScanSettings.Builder();
        settingsBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
             List<ScanFilter> filters = new ArrayList<ScanFilter>();
                  filters.add(filterBuilder.build());
                   bluetoothLeScanner.startScan(filters, settingsBuilder.build(), scanCallback);

           Log.d(TAG, "Bluetooth is currently scanning...");
                      }

以下是日志文件。
    04-29 18:09:11.415: E/AndroidRuntime(26155): FATAL EXCEPTION: main
    04-29 18:09:11.415: E/AndroidRuntime(26155): Process: com.android.androidble5, PID: 26155
    04-29 18:09:11.415: E/AndroidRuntime(26155): java.lang.IllegalStateException: Could not execute method of the activity
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.view.View$1.onClick(View.java:4020)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.view.View.performClick(View.java:4780)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.view.View$PerformClick.run(View.java:19866)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.os.Handler.handleCallback(Handler.java:739)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.os.Handler.dispatchMessage(Handler.java:95)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.os.Looper.loop(Looper.java:135) 
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.app.ActivityThread.main(ActivityThread.java:5254)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at java.lang.reflect.Method.invoke(Native Method)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at java.lang.reflect.Method.invoke(Method.java:372)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    04-29 18:09:11.415: E/AndroidRuntime(26155): Caused by: java.lang.reflect.InvocationTargetException
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at java.lang.reflect.Method.invoke(Native Method)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at java.lang.reflect.Method.invoke(Method.java:372)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at android.view.View$1.onClick(View.java:4015)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    ... 10 more
    04-29 18:09:11.415: E/AndroidRuntime(26155): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.bluetooth.le.BluetoothLeScanner.startScan(java.util.List, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback)' on a null object reference
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at com.android.androidble5.BluetoothUtility.startBleScan(BluetoothUtility.java:204)
    04-29 18:09:11.415: E/AndroidRuntime(26155):    at com.android.androidble5.MyActivity.handleScanStart(MyActivity.java:247)

1
您的BluetoothLeScanner似乎未初始化。请添加您方法的代码。 - Sebastian Walla
私有的无返回值方法 enableBluetooth() { if(bluetoothAdapter == null) { //bluetoothState.setText("Bluetooth NOT supported"); } else if(!bluetoothAdapter.isEnabled()) { //bluetoothAdapter.enable(); Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); activity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } } - Deepak
这是启用蓝牙的方法。 - Deepak
2个回答

3
正确的方法是在开始扫描之前检查BluetoothLeScanner对象是否为空,就像我们检查BluetoothAdapter一样。
示例
if(bluetoothLeScanner != null){
             bluetoothLeScanner.startScan(filters,settingsBuilder.build(),scanCallback);

    }

0

你可以通过对话框告诉用户蓝牙未启用,然后使用以下代码在用户点击“确定”时为其启用(如果用户点击“取消”,则不执行任何操作):

final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (!bluetoothAdapter.isEnabled()) {
 final AlertDialog.Builder builder = new AlertDialog.Builder(this);
 builder.setTitle("Bluetooth not enabled");
 builder.setMessage("Press OK to enable bluetooth");
 builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
   Log.d(TAG, "Enabling bluetooth");
   bluetoothAdapter.enable();
  }
 });
 builder.setNegativeButton(android.R.string.cancel, null);
 builder.show();
}

它在Android KitKat上运行良好。在棒棒糖上,应用程序会先崩溃,然后显示弹出窗口以启用蓝牙。 - Deepak
请在上面编辑您的问题,并附上代码摘录,其中包含 MyActivity.handleScanStart - davidgyoung

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