简体   繁体   中英

Android ble app crash if bluetooth is turned off in android lollipop

Hello I am try to scan the bluetooth ble device for Android Lollipop. It is working fine but if turned off the bluetotooth an then run the App it will crash and then give the pop up to enable the bluetooth.Ideally like it should give the pop up to enable bluetooth if it is turned off.

This is the method, which should enable bluetooth:

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

code to start scan

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

Enable Start Scan

  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...");
                      }

Below is the log file

    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)

The correct approach would be before starting the scan we have to check BluetoothLeScanner object null or not like we check for BluetoothAdapter

Sample

if(bluetoothLeScanner != null){
             bluetoothLeScanner.startScan(filters,settingsBuilder.build(),scanCallback);

    }

You can tell a user that bluetooth is not enabled with a dialog, and then enable it for them when they hit OK (or do nothing if they hit Cancel) with code like this:

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();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM