Android中蓝牙错误连接的操作

Android中蓝牙错误连接的操作,android,bluetooth,Android,Bluetooth,我正在构建一个android应用程序,通过蓝牙连接到Arduino板。我已成功连接并发送数据。在第一个活动中,我列出了所有配对设备和可用设备,当我单击其中一个设备时,如果它可用,它将连接到电路板,但如果它不可用(单击配对设备,但此设备不在附近或已禁用蓝牙)该应用程序会显示一个对话框,指示设备正在尝试连接,无法解除连接。手机无法连接到所选设备时是否会触发任何事件? 我认为这可以通过设置一个计时器来关闭对话框来实现,在这种情况下,如何停止正在进行的连接尝试?我已经找了几天了,我找到的唯一解决方案是与

我正在构建一个android应用程序,通过蓝牙连接到Arduino板。我已成功连接并发送数据。在第一个活动中,我列出了所有配对设备和可用设备,当我单击其中一个设备时,如果它可用,它将连接到电路板,但如果它不可用(单击配对设备,但此设备不在附近或已禁用蓝牙)该应用程序会显示一个对话框,指示设备正在尝试连接,无法解除连接。手机无法连接到所选设备时是否会触发任何事件?
我认为这可以通过设置一个计时器来关闭对话框来实现,在这种情况下,如何停止正在进行的连接尝试?我已经找了几天了,我找到的唯一解决方案是与断开连接和状态更改事件相关的。提前谢谢

这是我的代码

public void setOnDiscoveryListener(final OnDiscoveryListener listener){
    oldReceiver = receiver;
    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            switch (action){
                case BluetoothAdapter.ACTION_DISCOVERY_STARTED:
                listener.onStartDiscovery();
                break;

                case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
                listener.onStopDiscovery();
                break;

                case BluetoothDevice.ACTION_FOUND:
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                listener.onDeviceDiscovery(device);
                break;

                case BluetoothDevice.ACTION_ACL_CONNECTED:
                listener.onDeviceConnected();
                break;

                case BluetoothDevice.ACTION_ACL_DISCONNECTED:
                listener.onDeviceDisconnected();
                break;
            }
        }
    };
}
我使用一个接口来初始化广播接收器

bluetoothManager.setOnDiscoveryListener(new BluetoothManager.OnDiscoveryListener() {
    @Override
    public void onStartDiscovery() { }

    @Override
    public void onStopDiscovery() {
        progressBar.hide();
        refreshLayout.setEnabled(true);
        bluetoothManager.updateOnDiscoveryListener(discoveryListener);
        if(noAvailableDevices)
            noAvailableDevicesText.setVisibility(View.VISIBLE);
    }

    @Override
    public void onDeviceDiscovery(BluetoothDevice bluetoothDevice) {
        noAvailableDevices = false;
        availableDevicesAdapter.addDevice(new Device(bluetoothDevice.getName(), bluetoothDevice.getAddress()));
    }

    @Override
    public void onDeviceConnected() {
        progressDialog.dismiss();
        Intent intent = new Intent(activity, MenuActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

    @Override
    public void onDeviceDisconnected() { }
});
最后,我使用这些过滤器

bluetoothManager.setDiscoveryFilters(activity, new String[]{
    BluetoothAdapter.ACTION_DISCOVERY_STARTED,
    BluetoothAdapter.ACTION_DISCOVERY_FINISHED,
    BluetoothDevice.ACTION_FOUND,
    BluetoothDevice.ACTION_ACL_CONNECTED,
    BluetoothDevice.ACTION_ACL_DISCONNECTED});
这是列表项的OnClick事件的代码

private View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String deviceName = ((TextView) view.findViewById(R.id.device_name)).getText().toString();
        String deviceAddress = ((TextView) view.findViewById(R.id.device_address)).getText().toString();
        progressDialog = ProgressDialog
            .show(activity, null, getResources().getString(R.string.connecting) + " " + deviceName, true);

        Intent intent = new Intent(activity, BluetoothService.class);
        intent.putExtra(Constants.MAC_KEY, deviceAddress);
        activity.startService(intent);
    }
};

将评论中的讨论总结为ans:-

在无线层,与远程设备的每一次交互都是异步的,因此您应该从底层的Android FW获得针对call to connect()的回调

如果您没有收到异步连接故障回调-另一种策略是在
OnClick()
中启动扫描,并将扫描回调中的设备(Bluetooth device Addr/MAC)与保存的设备匹配。如果扫描无法返回此设备ID,则连接肯定会失败。此时您可以清理进度条


话虽如此,当设备在范围内并且在扫描中被发现但由于其他原因无法连接时,会出现一种奇怪的情况,在这种情况下,您必须处理故障cb,将评论中的讨论总结为ans:-

在无线层,与远程设备的每一次交互都是异步的,因此您应该从底层的Android FW获得针对call to connect()的回调

如果您没有收到异步连接故障回调-另一种策略是在
OnClick()
中启动扫描,并将扫描回调中的设备(Bluetooth device Addr/MAC)与保存的设备匹配。如果扫描无法返回此设备ID,则连接肯定会失败。此时您可以清理进度条


虽然说当设备在范围内并且在扫描中被发现但由于其他原因无法连接时,会出现一种奇怪的情况,但在这种情况下,您必须处理故障cb

请在此处发布您的代码-您正在调用的API进行初始化..connect etcI我已经发布了我的代码。谢谢。使用调试器/日志,您是否看到
BluetoothAdapter.ACTION\u DISCOVERY\u STARTED:
被命中?我假设您有足够的清单权限:`“android.permission.BLUETOOTH”`另外,请在您单击配对设备并尝试连接的位置发布代码。请在此处发布您的代码-您正在调用的API s初始化..连接etcI我已经发布了我的代码。谢谢。使用调试器/日志,您是否看到
BluetoothAdapter.ACTION\u DISCOVERY\u STARTED:
被击中?我假设您有足够的清单权限:`“android.permission.BLUETOOTH”`也在您单击配对设备并尝试连接的位置发布代码