在平时的开发过程中,我们经常会需要通过蓝牙通信协议来实现与其他蓝牙设备通信以达到设备间的数据传输。
下面整理了一下安卓蓝牙通信常用的方法:
1、权限
在使用蓝牙功能时,必须提前申请蓝牙权限,主要是:
android.permission.BLUETOOTH: 允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作;
android.permission.BLUETOOTH_ADMIN: 允许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操作;
2、蓝牙基本操作
BluetoothAdapter这个类代表Android蓝牙操作的适配器,通过这个类你可以判断当前设备的蓝牙状态、搜索附近蓝牙设备、连接指定蓝牙设备等等。通过bluetoothManager.getAdapter()来获取这个对象,如果为空,则代表当前设备不支持蓝牙,调用bluetoothAdapter.isEnabled()来判断当前设备蓝牙是否开启,没有开启则可以引导用户跳转蓝牙设置界面中(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);)。
2.1搜索蓝牙设备
直接调用bluetoothAdapter.startDiscovery()来搜索附近蓝牙设备,这个效果就和你打开手机的蓝牙设置界面搜索蓝牙设备是一样的,不过APP还需要注册广播来获取搜索结果:
BluetoothAdapter.ACTION_DISCOVERY_STARTED 蓝牙设备搜索开始
BluetoothAdapter.ACTION_DISCOVERY_FINISHED 蓝牙设备搜索结束
BluetoothDevice.ACTION_FOUND 搜索到一个蓝牙设备
在广播接收器中,接收到BluetoothDevice.ACTION_FOUND时,可以通过intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)来获取一个BluetoothDevice对象,这个对象代表搜索到的蓝牙设备属性,包括蓝牙设备名称和Mac地址
2.2配对蓝牙设备
在搜索到的蓝牙设备列表中,你可以通过你的逻辑来判断配对哪个蓝牙设备,比如通过蓝牙名称,有些特定的设备蓝牙名称和配对码都是固定的,调用BluetoothDevice.createBond()方法来实现。
2.3连接蓝牙设备进行通信
配对完成后,你可以和蓝牙设备进行通信完成数据相互传输,不过这个过程,同时只能有一个设备与之通信,这个通信流程类似于网络通信的socket,也是一个长链接,在子线程中完成。
String SPP_UUID ="00001101-0000-1000-8000-00805F9B34FB";
UUID uuid = UUID.fromString(SPP_UUID);
try {
int sdk = Build.VERSION.SDK_INT;
if (sdk >=10) {
bluetoothSocket =bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);
}else {
bluetoothSocket =bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
}
bluetoothSocket.connect();//socket连接
if(bluetoothSocket.isConnected()){//连接成功
isConnect=true;
Message message =new Message();
message.what =0;
message.obj =bluetoothDevice.getAddress();
//更新ui
mHandler.sendMessage(message);
InputStream is=bluetoothSocket.getInputStream();//获取蓝牙设备发送的数据
byte[] buffer =new byte[1024];
int len;
String content;
while ((len=is.read(buffer)) != -1) {
content=new String(buffer, 0, len);
Message message1 =new Message();
message1.what =1;
message1.obj = content;
//更新ui
mHandler.sendMessage(message1);
}
}
}catch (Exception e) {
isConnect=false;
// e.printStackTrace();
mHandler.sendEmptyMessage(-1);
}finally {
if(bluetoothSocket!=null){
try {
bluetoothSocket.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
这样基本上就实现了蓝牙设备之间的数据传输,在退出界面时,不要忘了断开当前蓝牙连接,取消广播接收和蓝牙设备的搜索。
2.4其他常用操作
获取当前已经配对的蓝牙设备列表:getBoundedDevices()
根据Mac地址获取远程蓝牙设备:getRemoteDevice(String address)