Android中蓝牙错误连接的操作

时间:2017-06-07 18:15:37

标签: android bluetooth

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

这是我的代码

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

1 个答案:

答案 0 :(得分:0)

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

在无线电层,与远程设备的每次互动都是异步因此,您应该从底层Android FW回调 connect()

如果您没有收到异步连接失败回叫 - 另一种策略是在OnClick()开始扫描,并在扫描回调中将设备(蓝牙设备地址/ MAC)与您保存的设备匹配。如果扫描无法返回此设备ID,则连接肯定会失败。那时你可以清理进度条。

已经说过,当设备在范围内并且在扫描中被发现但由于某些其他原因而无法连接时会出现奇怪的情况,在这种情况下你将不得不处理故障cb