Android 蓝牙开发 自动连接已匹配设备时连接缓慢

Android 蓝牙开发 自动连接已匹配设备时连接缓慢

BluetoothAdapter 的startDiscovery()方法是个耗资源操作所以需要在尝试配对时将其关闭。

下面是部分 代码.

  private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                  String action = intent.getAction(); //获取当前正在执行的动作...
                  Log.e(TAG,"--------------------ready to conncet BlueTooth---------------------");

                  if (BluetoothDevice.ACTION_FOUND.equals(action)) //正在搜索过程...
                  {
                        Log.e(TAG,"--------------------before connect  BlueTooth---------------------");
                        // 通过EXTRA_DEVICE附加域来得到一个BluetoothDevice设备
                        BluetoothDevice devices = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                        // 如果这个设备是不曾配对过的,添加到list列表
                        if (devices.getBondState() != BluetoothDevice.BOND_BONDED) {
                              if (null == devices.getName() || addressSet.contains(devices.getAddress())) {
                                    return;
                              }

                              addressSet.add(devices.getAddress());

                              list.add(new ChatMessage(devices.getName() + "\n" + devices.getAddress(), MessageType.BLUETOOTH_DEV_UNBONDED));
                              clientAdapter.notifyDataSetChanged();
                              mListView.setSelection(list.size() - 1);
                        }else {
								//这一步就是查找之前绑定过的设备 匹配就开启一个新的线程 
								//因为在安卓开发中耗时操作不能放在主线程当中
                              device=mBluetoothAdapter.getRemoteDevice(devices.getAddress());
                              blueTooth_path = devices.getAddress();
                              Log.e(TAG,"--------------------new Thread conncet BlueTooth---------------------");
                              mClientThread = new ClientThread();  //开启新的线程...
                              mClientThread.start();
                        }
                  } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) //搜索结束后的过程...
                  {
                        setProgressBarIndeterminateVisibility(false);  //这步是如果设备过多是否显示滚动条...
                        if (mListView.getCount() == 0) {
                              list.add(new ChatMessage("没有发现蓝牙设备", MessageType.SYSTEM_ERROR));
                              clientAdapter.notifyDataSetChanged();
                              mListView.setSelection(list.size() - 1);
                        }
                  } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
                        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                        // 更新蓝牙设备的绑定状态
                        if (device.getBondState() == BluetoothDevice.BOND_BONDING) {
                              list.add(new ChatMessage("正在配对" + device.getName(), MessageType.SYSTEM_FEEDBACK));
                        } else if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                              list.add(new ChatMessage("完成配对" + device.getName(), MessageType.SYSTEM_FEEDBACK));
                        } else if (device.getBondState() == BluetoothDevice.BOND_NONE) {
                              list.add(new ChatMessage("取消配对" + device.getName(), MessageType.SYSTEM_FEEDBACK));
                        }
                  }
            }
      };

开启客户端连接服务端,因为是需要自动连接 所以我在进入这个线程后关闭搜索过程,这样连接耗时就大大减少

private class ClientThread extends Thread {
            @Override
            public void run() {
                  // TODO Auto-generated method stub
                  if (device != null) {
                        try {
                              /* 下面这步也是关键,我们如果想要连接服务器,我们需要调用方法createRfcommSocketToServiceRecord
                               * 参数00001101-0000-1000-8000-00805F9B34FB表示的是默认的蓝牙串口...通过传递参数调用方法,
                               * 会返回给我们一个套接字..这一步就是获取套接字,实现连接的过程...
                               *
                               * */
                              mBluetoothAdapter.cancelDiscovery();
                              socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                           
                              // 通过socket连接服务器,正式形成连接...这是一个阻塞过程,直到连接建立或者连接失效...
                              socket.connect();      
                              // 如果连接成功了...这步就会执行...更新UI界面...否则走catch(IOException e)
                              Message uiMessage = new Message();
                              uiMessage.what = 0;
                              Log.e(TAG,"--------------------refesh ---------------------"+blueTooth_path);
                              refreshUI.sendMessage(uiMessage);
                              // 可以开启读数据线程
                              mReadThread = new ReadThread();
                              mReadThread.start();
                        } catch (IOException e) {
                              // TODO Auto-generated catch block
                              // socket.connect()连接失效
                              Message msg = new Message();
                              msg.what = 3;
                              msg.obj = "连接服务端异常!断开连接重新试一试。";
                              LinkDetectedHandler.sendMessage(msg);
                        }
                  }
            }
      }

刚自学安卓的新手 大佬们请手下留情在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值