本应用共包含五个java文件:
Constants:常量值定义文件
Utils:工具类,包含log包装,toast包装,以及sharedpreference的包装
DeviceBean:封装BluetoothDevice, 包含device信息
DeviceListAdapter:ListView的适配器,其中有对list列表,按钮点击事件的处理
DeviceListActivity:应用中的唯一UI界面
其中readMe为说明文件
开启蓝牙代码:
向系统发送请求,开启蓝牙,该过程会请求用户同意开启蓝牙
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
接下来开启蓝牙扫描,
btAdapter.startDiscovery();
在扫描过程中过滤掉非A2DP的设备
if (btClass.getMajorDeviceClass() != BluetoothClass.Device.Major.AUDIO_VIDEO) { /**本demo只处理a2dp设备,所以只显示a2dp,过滤掉其他设备*/ break; }
之后点击界面的connect按钮连接对应设备
Method method = BluetoothA2dp.class.getMethod("connect", new Class[]{BluetoothDevice.class}); method.invoke(bluetoothA2dp, device);
在连接成功后可以断开对应设备
Method method = BluetoothA2dp.class.getMethod("disconnect", new Class[]{BluetoothDevice.class}); method.invoke(bluetoothA2dp, device);
当应用退出或者进程被杀死后,重新进入应用时会加载原先已连接的蓝牙设备。
/**
* 获取到保存的a2dp连接
* @param context
* @return
*/
static DeviceBean fetchConnectedDevice(Context context){
DeviceBean deviceBean = null;
SharedPreferences sharedPreferences = context.getSharedPreferences(
Constants.PREF_CONNECTED_DEVICE, Context.MODE_PRIVATE);
String name = sharedPreferences.getString(Constants.PREF_DEVICE_NAME, null);
String address = sharedPreferences.getString(Constants.PREF_DEVICE_ADDRESS, null);
if (address != null) {
deviceBean = new DeviceBean();
deviceBean.setName(name == null ? address : name);
deviceBean.setAddress(address);
deviceBean.setState(BluetoothAdapter.STATE_CONNECTED);
}
return deviceBean;
}
断开设备:
/**
* 断开当前a2dp设备
*
* @param device device
*/
private void disconnectA2dp(BluetoothDevice device) {
if (bluetoothA2dp == null || device == null) {
return;
}
try {
Method method = BluetoothA2dp.class.getMethod("disconnect", new Class[]{BluetoothDevice.class});
method.invoke(bluetoothA2dp, device);
} catch (IllegalAccessException e) {
e.printStackTrace();
Utils.logE(TAG, e.getMessage());
} catch (InvocationTargetException e) {
e.printStackTrace();
Utils.logE(TAG, e.getMessage());
} catch (NoSuchMethodException e) {
e.printStackTrace();
Utils.logE(TAG, e.getMessage());
}
}
具体代码参考源码,谢谢。
备注,加载已连接的蓝牙设备是只针对该应用,也就是说只加载在该应用中进行连接的设备,对于通过设置连接的设备,不做处理。
本应用只是提供一个雏形,更多功能需求还需要自己去完善
在杀死应用或者重启手机,重新进入应用时依旧可以看到已连接的设备