蓝牙开启检测
/**
* 检查蓝牙是否可用
* @param context
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private void checkBleDevice(Context context){
bluetoothManager= (BluetoothManager) this.getSystemService(BLUETOOTH_SERVICE);
adapter=bluetoothManager.getAdapter();
msg2.setText("已经获得管理器");
if (adapter!=null){
if (!adapter.isEnabled()){
Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); //一下三行是打开蓝牙勾选界面
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
msg1.setText("需要打开蓝牙");
}else {
msg1.setText("蓝牙可用");
}
}else {
Toast.makeText(context,"该设备不支持蓝牙",Toast.LENGTH_LONG).show();
msg1.setText("不支持蓝牙");
}
}
蓝牙获取已配对设备
/**
* 获取配对设备
*/
private void getBondDevice(){
pairedDevices=adapter.getBondedDevices();
if (pairedDevices==null){
return;
}
StringBuilder sb=new StringBuilder();
for (BluetoothDevice device:pairedDevices){
String name=device.getName();
String address=device.getAddress();
sb.append("名称:");
sb.append(name);
sb.append(" 地址:");
sb.append(address);
sb.append("\n");
}
listleft.setText(sb.toString());
}
开启蓝牙页面搜索
/**
* 获得管理权限
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private void startDiscover(){
if (adapter.startDiscovery()){
list.setText("开始扫描");
}else {
list.setText("启动失败");
}
}
注册接收蓝牙的BroadCastReceiver
/**
* @author:yuzhetao
* @date:2018/7/10
* @usage:
*/
public class BluetoothReceiver extends BroadcastReceiver {
public BluetoothReceiver() {
}
RegisterBltReceiver onRegisterBltReceiver;
public BluetoothReceiver(RegisterBltReceiver onRegisterBltReceiver) {
this.onRegisterBltReceiver = onRegisterBltReceiver;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Bundle b = intent.getExtras();
Object[] lstName = b.keySet().toArray();
// 显示所有收到的消息及其细节
for (int i = 0; i < lstName.length; i++) {
String keyName = lstName[i].toString();
Log.i("bluetooth", keyName + ">>>" + String.valueOf(b.get(keyName)));
}
final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (!"BC:E6:3F:74:B9:95".equals(device.getAddress())) {
return;
}
// 搜索发现设备时,取得设备的信息;注意,这里有可能重复搜索同一设备
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
onRegisterBltReceiver.onBltFound(device);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
if (!device.createBond()) {
onRegisterBltReceiver.onBltNone(device);
}
} else {
onRegisterBltReceiver.onBltEnd(device);
connectDevive(device, new Callback() {
@Override
public void connected() {
onRegisterBltReceiver.onBltConneted(device);
}
});
}
}
//状态改变时
else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
switch (device.getBondState()) {
case BluetoothDevice.BOND_BONDING://正在配对
Log.d("BlueToothTestActivity", "正在配对......");
onRegisterBltReceiver.onBltStart(device);
break;
case BluetoothDevice.BOND_BONDED://配对结束
Log.d("BlueToothTestActivity", "完成配对");
onRegisterBltReceiver.onBltEnd(device);
connectDevive(device, new Callback() {
@Override
public void connected() {
onRegisterBltReceiver.onBltConneted(device);
}
});
break;
case BluetoothDevice.BOND_NONE://取消配对/未配对
Log.d("BlueToothTestActivity", "取消配对");
onRegisterBltReceiver.onBltNone(device);
default:
break;
}
}
}
interface Callback {
void connected();
}
private void connectDevive(final BluetoothDevice device, final Callback callback) {
BackgroundExecutor.execute(new Runnable() {
@Override
public void run() {
try {
UUID uuid=device.getUuids()[0].getUuid();
BluetoothSocket socket=device.createRfcommSocketToServiceRecord(uuid);
int i=0;
while (!connectSocket(socket)||i>=device.getUuids().length){
i++;
socket=device.createInsecureRfcommSocketToServiceRecord(device.getUuids()[i].getUuid());
}
if (socket.getInputStream() != null) {
UiThreadExecutor.runTask("", new Runnable() {
@Override
public void run() {
callback.connected();
}
}, 0L);
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
/**如果失败返回false
**/
private boolean connectSocket(BluetoothSocket socket) {
try {
socket.connect();
return true;
} catch (Exception e) {
return false;
}
}
}
注意 在之前已经配对过的设备,将不会有正在配对的状态,
直接会收到配对完成
其次配对完成之后,需要向配对设备发送数据
这其中需要多次尝试设备的历史UUID
比如
UUID uuid=device.getUuids()[0].getUuid();
BluetoothSocket socket=device.createRfcommSocketToServiceRecord(uuid);
int i=0;
while (!connectSocket(socket)||i>=device.getUuids().length){
i++;
socket=device.createInsecureRfcommSocketToServiceRecord(device.getUuids()[i].getUuid());
}
连接有可能失败会出现java.io.IOException: read failed, socket might closed or timeout, read ret: -1,
要不断循环连接 直到尝试成功
目标设备
连接详情