android学习之蓝牙 - 蓝牙连接打印机Demo

时间:2022-02-01 16:23:41

权限:

     <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);