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);
}
}
}
}
刚自学安卓的新手 大佬们请手下留情