Android 当我将函数调用移动到其他按钮时,为什么我的ble应用程序会崩溃?

Android 当我将函数调用移动到其他按钮时,为什么我的ble应用程序会崩溃?,android,crash,bluetooth-lowenergy,psoc,Android,Crash,Bluetooth Lowenergy,Psoc,我目前正在尝试使我正在开发的应用程序更易于使用,但我在尝试整合与PSoC 4 BLE建立连接所需的按钮数量时遇到了一个问题。最后,我想要一个按钮来处理服务的搜索、连接和发现。但是,当我在处理激活蓝牙无线电的方法下复制并通过代码(用于搜索、连接和发现)时,应用程序在遇到扫描回调时崩溃。我还是Android应用程序开发新手,我正在尝试使用调试器,但我似乎被卡住了。第一段代码是我正在尝试做的,第二段代码是正在调用的scan函数。以下代码段是调试器输出 //我想做什么 公共无效startBluetoot

我目前正在尝试使我正在开发的应用程序更易于使用,但我在尝试整合与PSoC 4 BLE建立连接所需的按钮数量时遇到了一个问题。最后,我想要一个按钮来处理服务的搜索、连接和发现。但是,当我在处理激活蓝牙无线电的方法下复制并通过代码(用于搜索、连接和发现)时,应用程序在遇到扫描回调时崩溃。我还是Android应用程序开发新手,我正在尝试使用调试器,但我似乎被卡住了。第一段代码是我正在尝试做的,第二段代码是正在调用的scan函数。以下代码段是调试器输出

//我想做什么
公共无效startBluetooth(视图){
/**查找可扩展服务和适配器*/
最终BluetoothManager BluetoothManager=
(BluetoothManager)getSystemService(Context.BLUETOOTH\u服务);
BluetoothAdapter mBluetoothAdapter=bluetoothManager.getAdapter();
/**确保在设备上启用蓝牙。如果当前未启用蓝牙,
//激发显示对话框的意图,要求用户授予启用该对话框的权限*/
如果(!mBluetoothAdapter.isEnabled()){
Intent enablebintent=新意图(BluetoothAdapter.ACTION\u REQUEST\u ENABLE);
startActivityForResult(启用意图、请求和启用);
}
/**启动BLE服务*/
Log.d(标签“启动可恢复服务”);
Intent-gattServiceIntent=newintent(这是PSoCCapSenseLEDService.class);
bindService(gattServiceIntent、mServiceConnection、BIND_AUTO_CREATE);
/**禁用“开始”按钮并打开“搜索”按钮*/
启动按钮。设置启用(错误);
搜索按钮。设置已启用(真);
Log.d(标签“蓝牙已启用”);
//搜索功能不会使应用程序崩溃
//无法强制单步执行if语句,mServiceConnected是否为true?
//没有mServiceConnected显示为false
//好的,让我们强制执行这个if语句
//但首先要将代码设置回正常状态,并查看mServiceConnected是如何设置的
mPSoCCapSenseLedService.scan();//导致崩溃
mPSoCCapSenseLedService.connect();//崩溃
mPSoCCapSenseLedService.discoverServices();
}
公共作废扫描(){
/**扫描设备并查找具有我们所需服务的设备
*UUID以F0结尾,即LED CapSense服务*/
UUID capsenseLedService=UUID.fromString(capsenseLedServiceUUID);
UUID[]capsenseLedServiceArray={capsenseLedService};
/**对不同平台版本的版本使用旧的扫描方法*/
if(Build.VERSION.SDK\u INT

在绑定服务之前,可能需要扫描并停止扫描。 我的ble扫描和绑定如下:

final BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
ScanSettings settings = new ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
    .build();
List<ScanFilter> filters = new ArrayList<>();
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        scanner.stopScan(scanCallback);
        bindService(new Intent(ControlActivity.this, BLEService.class), 
            mServiceConnection, BIND_AUTO_CREATE);

            }
        }
    }, 3500);

    scanner.startScan(filters, settings, scanCallback);

在绑定服务之前,可能需要扫描并停止扫描。 我的ble扫描和绑定如下:

final BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
ScanSettings settings = new ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
    .build();
List<ScanFilter> filters = new ArrayList<>();
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        scanner.stopScan(scanCallback);
        bindService(new Intent(ControlActivity.this, BLEService.class), 
            mServiceConnection, BIND_AUTO_CREATE);

            }
        }
    }, 3500);

    scanner.startScan(filters, settings, scanCallback);

在与我的教授讨论之后,我们发现扫描、连接和discoverSevices回调几乎同时执行,而不是按顺序执行。为了避免同时执行,我延迟了回调,经过大量的尝试和错误,这些是我发现的最佳延迟

public void startBluetooth(视图){
/**查找可扩展服务和适配器*/
最终BluetoothManager BluetoothManager=
(BluetoothManager)getSystemService(Context.BLUETOOTH\u服务);
BluetoothAdapter mBluetoothAdapter=bluetoothManager.getAdapter();
/**确保在设备上启用蓝牙。如果当前未启用蓝牙,
//激发显示对话框的意图,要求用户授予启用该对话框的权限*/
如果(!mBluetoothAdapter.isEnabled()){
Intent enablebintent=新意图(BluetoothAdapter.ACTION\u REQUEST\u ENABLE);
startActivityForResult(启用意图、请求和启用);
}
/**启动BLE服务*/
Log.d(标签“启动可恢复服务”);
Intent-gattServiceIntent=newintent(这是PSoCCapSenseLEDService.class);
bindService(gattServiceIntent、mServiceConnection、BIND_AUTO_CREATE);
/**禁用“开始”按钮并打开“搜索”按钮*/
启动按钮。设置启用(错误);
搜索按钮。设置已启用(真);
Log.d(标签“蓝牙已启用”);
新的倒计时(151000){
公共无效onFinish(){
//计时器结束时
//在这里执行代码
mPSoCCapSenseLedService.scan();
}
公共void onTick(长毫秒未完成){
//毫秒直到完成的时间量。
}
}.start();
//扫描后大约65毫秒
新的倒计时(801000){
公共无效onFinish(){
private final ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        bleService = ((BLEService.LocalBinder) service).getService();
        try {
            bleService.connect(device mac);
        } catch (Exception e) {
            updateText("Connection Disconnected...");
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        bleService = null;
    }
};