android 蓝牙设备监听广播

蓝牙权限 <uses-permission android:name="android.permission.BLUETOOTH" />

1、监听手机本身蓝牙状态的广播

手机蓝牙开启关闭时发送

action: BluetoothAdapter.ACTION_STATE_CHANGED

if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR);
switch (state) {
case BluetoothAdapter.STATE_OFF:
Log.d("aaa", "STATE_OFF 手机蓝牙关闭");
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Log.d("aaa", "STATE_TURNING_OFF 手机蓝牙正在关闭");
break;
case BluetoothAdapter.STATE_ON:
Log.d("aaa", "STATE_ON 手机蓝牙开启");
break;
case BluetoothAdapter.STATE_TURNING_ON:
Log.d("aaa", "STATE_TURNING_ON 手机蓝牙正在开启");
break;
}
}

2、监听蓝牙设备配对状态的广播

蓝牙设备配对和解除配对时发送

action: BluetoothDevice.ACTION_BOND_STATE_CHANGED

if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String name = device.getName();
Log.d("aaa", "device name: " + name);
int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);
switch (state) {
case BluetoothDevice.BOND_NONE:
Log.d("aaa", "BOND_NONE 删除配对");
break;
case BluetoothDevice.BOND_BONDING:
Log.d("aaa", "BOND_BONDING 正在配对");
break;
case BluetoothDevice.BOND_BONDED:
Log.d("aaa", "BOND_BONDED 配对成功");
break;
}
}

3、监听蓝牙设备连接和连接断开的广播

蓝牙设备连接上和断开连接时发送, 这两个监听的是底层的连接状态

action: BluetoothDevice.ACTION_ACL_CONNECTED   BluetoothDevice.ACTION_ACL_DISCONNECTED

if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.d("aaa", device.getName() + " ACTION_ACL_CONNECTED");
} else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.d("aaa", device.getName() + " ACTION_ACL_DISCONNECTED");
}

BluetoothClass 可以获取蓝牙设备的类型

如果想获取当前已连接上的所有蓝牙设备,可以在这两个广播中手动维护一个连接设备的列表。

像下面这样:

/**
* 记录当前正在连接的所有蓝牙输入设备
*/
public List<BluetoothDevice> connectedBluetoothDevices = new ArrayList<BluetoothDevice>(); if (intent.getAction().equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (isInputDevice(device)) {
List<BluetoothDevice> connectedBluetoothDevices = ((MyApplication) getApplication()).connectedBluetoothDevices;
if (!connectedBluetoothDevices.contains(device)) {
connectedBluetoothDevices.add(device);
}
}
} else if (intent.getAction().equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (isInputDevice(device)) {
List<BluetoothDevice> connectedBluetoothDevices = ((MyApplication) getApplication()).connectedBluetoothDevices;
connectedBluetoothDevices.remove(device);
}
} /**
* 判断蓝牙设备是否是输入设备,这里认为 PERIPHERAL是输入设备
*/
private boolean isInputDevice(BluetoothDevice device) {
int deviceMajorClass = device.getBluetoothClass().getMajorDeviceClass();
if (deviceMajorClass == BluetoothClass.Device.Major.PERIPHERAL) {
return true;
} return false;
}
上一篇:【shell编程基础3】shell编程的组合应用之二:管道及其命令


下一篇:[译] Angular 2 VS. React: 血色将至