美文网首页
Android 蓝牙

Android 蓝牙

作者: ccDown | 来源:发表于2019-03-04 18:57 被阅读0次

先上demo:https://github.com/soulListener/BlueToothDemo


最近公司要适配一款读卡器,是通过蓝牙进行CPU卡和M1卡的读写操作,没搞过蓝牙,做下记录。
Android设备操作蓝牙需要以下步骤

1、在Manifest文件中添加权限
2、判断是否支持蓝牙、是否开启蓝牙
3、获取广播列表
发送蓝牙搜索广播、蓝牙扫描结束广播(在OnDestory中反注册广播防止泄露),在搜索广播回调中获取蓝牙设备,在蓝牙扫描结束广播中进行相应的结束操作
4、连接蓝牙(连接蓝牙之前要关闭蓝牙扫描操作,区分经典蓝牙和低功耗蓝牙)
5、数据通讯

1.在manifest文件中添加权限

 <uses-permission android:name="android.permission.BLUETOOTH"/>
 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

如果是6.0以上的则需再加上

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

2.判断是否支持蓝牙、是否开启蓝牙

if (mBluetoothAdapter == null) {
        Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
        finish();
    }
    // 判断是否打开蓝牙
    if (!mBluetoothAdapter.isEnabled()) {
        // 弹出对话框提示用户是后打开
        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        Toast.makeText(this, "正在搜索", Toast.LENGTH_SHORT).show();
        startActivityForResult(intent, SEARCH_CODE);
    } else {
        // 打开蓝牙
        Toast.makeText(this,"正在打开连接",Toast.LENGTH_SHORT).show();
        mBluetoothAdapter.enable();
    }

3.有两种实现形式

(1)发送蓝牙搜索广播、蓝牙扫描结束广播,在搜索广播回调中获取蓝牙设备,在蓝牙扫描结束广播中进行相应的结束操作

if (mBluetoothAdapter.isDiscovering()) {
        mBluetoothAdapter.cancelDiscovery();
    }
    //开始扫描
    mBluetoothAdapter.startDiscovery();
    receiver = new BluetoothReceiver();
    //蓝牙扫描广播
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(receiver, filter);
    //蓝牙扫描结束广播
    IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(receiver, filter1);

还有广播

private class BluetoothReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            mBluelist.add(device);
            myBlueToothAdapter.notifyDataSetChanged();
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
            mBluetoothAdapter.cancelDiscovery();
        }
    }
}

(2)SDK21版本以上的可以使用mBluetoothAdapter.getBluetoothLeScanner().startScan(ScanCallback)来获取列表

mBluetoothAdapter.getBluetoothLeScanner().startScan(new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            mBluelist.add(result.getDevice());
            myBlueToothAdapter.notifyDataSetChanged();
        }
    });

4.连接蓝牙

在这里要特别区分一下,蓝牙连接分为经典蓝牙 和 低功耗蓝牙,两种蓝牙的连接方式是不一样的。我在这里卡了半天调不通才发现蓝牙还有这种区别(都怪自己技术差)。

(1)经典蓝牙
经典蓝牙通讯通过BlueToothSocket这个类,读写数据跟java中的Socket是一样的。获取方式是通过

 BlueToothSocket blueToothSocket = device.createRfcommSocketToServiceRecord(UUID);
 blueToothSocket.connect();

(2)低功耗蓝牙
低功耗蓝牙通过Device的connectGatt方法进行连接,在BluetoothGattCallback回调中进行控制。

BluetoothGatt bluetoothGatt = device.connectGatt(this, false,bluetoothGattCallback);

5.数据通讯

(1)经典蓝牙
读写数据通过IO流就可以:

InputStream inputStream = blueToothSocket .getInputStream();
OutputStream outputStream = blueToothSocket .getOutputStream();

(2)低功耗蓝牙
通过BluetoothGattCharacteristic获取对应的UUID进行读写数据

 BluetoothGattService bgs = gatt.getService(UUID.fromString("ServiceUUID"));
 BluetoothGattCharacteristic mBleWriter = bgs.getCharacteristic(UUID.fromString("BlueWriterUUID"));
 BluetoothGattCharacteristic mBleReader = bgs.getCharacteristic(UUID.fromString("BlueReaderUUID"));
 Log.d("mBleWriter", "mBleWriter: type " + mBleWriter.getWriteType() + ", " + mBleWriter.getDescriptors().size());
 Log.d("mBleReader", "mBleReader: type " + mBleReader.getWriteType() + ", " + mBleReader.getDescriptors().size());
 mBleWriter.setValue("1111".getBytes());
 bluetoothGatt.writeCharacteristic(mBleWriter);

哦,对了还有属性变量

private ArrayList<BluetoothDevice> mBluelist;
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private int SEARCH_CODE = 0;
private BluetoothReceiver receiver;
private MyBlueToothAdapter myBlueToothAdapter;
private BluetoothGatt bluetoothGatt;

相关文章

网友评论

      本文标题:Android 蓝牙

      本文链接:https://www.haomeiwen.com/subject/fnjduqtx.html