权限:
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
概念:10米以内的短距离通信方式。
uuid:通用唯一识别码
蓝牙的通信可以理解为 配对和连接。
配对可以理解为匹配 连接可以理解为双方设置连接通信规则。
主要对象 :
BluetoothAdapter 本机的蓝牙 BluetoothDevice 外部的蓝牙设备
1 判断设备是否有蓝牙
//获取蓝牙适配器对象 如果对象不为空 说明设备存在蓝牙 否则设备不存在蓝牙
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
2 判断蓝牙是否已经开启 没有开启就去开启蓝牙
if(bluetoothAdapter!=null){
//判断蓝牙是否可用 不可以用就开启蓝牙 开启表示可用
if(!bluetoothAdapter.isEnabled()){
//通过一个意图启动蓝牙 请求码大于0就可以了
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, 4);
}
}else{
Toast.makeText(MainActivity.this, "该设备不存在蓝牙", 0).show();
}
3 搜索蓝牙设备
调用bluetoothAdapter.startDiscovery();方法来完成搜索
然后就会发送广播 因此要接收广播 当意图为BluetoothDevice.ACTION_FOUND时候就可以获取到对应的设备对象
private class BluetoothcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//如果是发现了外部蓝牙的话
if(action.equals(BluetoothDevice.ACTION_FOUND)){
//获取到了外部设备
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String name = device.getName();
Log.i("name", name);
}
}
}
BroadcastReceiver receiver = new BluetoothcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter);
获取到外部的蓝牙对象:
BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
然后就可以获取到外部蓝牙设备的信息了。
4 获取到对应的和外部蓝牙是否已经绑定了 可以获取到对应的蓝牙状态 。
device.getBondState() == BluetoothDevice.BOND_BONDED || BOND_NONE || BluetoothDevice.BOND_BONDING
5 对应的接收的广播里面可以获取本机蓝牙的状态
搜索蓝牙完成:BluetoothAdapter.ACTION_DISCOVERY_FINISHED
6 对应的本机的蓝牙的状态改变为:BluetoothAdapter.ACTION_STATE_CHANGED
蓝牙开启状态 : BluetoothAdapter.STATE_ON
蓝牙关闭状态: BluetoothAdapter.STATE_OFF
7 蓝牙配对方法:
//反射调用方法
try {
Method method = BluetoothDevice.class.getMethod("createBond");
method.invoke(deviceList.get(position));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
8 蓝牙连接的方法 从而获取到对应的输出流对象 将对应的文件转换成输出就可以传送到其他蓝牙设备。
try {
bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
bluetoothSocket.connect();
//获取了对应的输入流
outputStream = bluetoothSocket.getOutputStream();
isConnection = true;
} catch (IOException e) {
e.printStackTrace();
}
例如传送数据到打印机 打印。
byte[] dataBytes= data.getBytes("gbk");
outputStream.write(dataBytes, 0, dataBytes.length);