Android 如果在 android lollipop 中关闭蓝牙,ble 应用程序会崩溃
Android ble app crash if bluetooth is turned off in android lollipop
您好,我正在尝试扫描 Android Lollipop 的蓝牙设备。它工作正常但是如果关闭蓝牙然后 运行 应用程序它会崩溃然后弹出窗口以启用 bluetooth.Ideally 就像它应该弹出窗口以启用蓝牙如果它被打开关闭。
这是方法,应该启用蓝牙:
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.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.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)
您可以通过对话框告诉用户蓝牙未启用,然后在他们点击“确定”时为他们启用蓝牙(或者如果他们点击“取消”则不执行任何操作),代码如下:
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();
}
正确的方法是在开始扫描之前,我们必须检查 BluetoothLeScanner 对象是否为 null,就像我们检查 BluetoothAdapter
样本
if(bluetoothLeScanner != null){
bluetoothLeScanner.startScan(filters,settingsBuilder.build(),scanCallback);
}
您好,我正在尝试扫描 Android Lollipop 的蓝牙设备。它工作正常但是如果关闭蓝牙然后 运行 应用程序它会崩溃然后弹出窗口以启用 bluetooth.Ideally 就像它应该弹出窗口以启用蓝牙如果它被打开关闭。
这是方法,应该启用蓝牙:
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.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.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)
您可以通过对话框告诉用户蓝牙未启用,然后在他们点击“确定”时为他们启用蓝牙(或者如果他们点击“取消”则不执行任何操作),代码如下:
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();
}
正确的方法是在开始扫描之前,我们必须检查 BluetoothLeScanner 对象是否为 null,就像我们检查 BluetoothAdapter
样本
if(bluetoothLeScanner != null){
bluetoothLeScanner.startScan(filters,settingsBuilder.build(),scanCallback);
}