目录
5、在onActivityResult中获取打开蓝牙结果 (蓝牙的状态也会通过广播方式返回)
首先说下蓝牙4.0
蓝牙 4.0 是 2012 年最新蓝牙版本,是 3.0 的升级版本;较 3.0 版本更省电、成本低、3 毫秒低延
迟、超长有效连接距离、AES-128 加密等。
蓝牙 4.0 最重要的特性是省电,极低的运行和待机功耗可以使一粒纽扣电池连续工作数年之久。
此外,低成本和跨厂商互操作性,3 毫秒低延迟、AES-128 加密等诸多特色,可以用于计步器、心律
监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙技术的应用范围。
模块做为智能手机外设的桥梁,使得主机端应用开发异常简单。在桥接模式下(串口), 用户的
现有产品或者方案配合此透传模块,能十分方便地和移动设备(需支持蓝牙 4.0)相互通讯,实现超强
的智能化控制和管理(抄写于BLE4.0贴片模块手册)。
目前android蓝牙有2种:
1)蓝牙2.0
传统蓝牙适用于电池使用强度较大的操作,例如 Android 设备之间的流式传输和通信等
当然速度也比较快 (128byte/5ms 这是理想速度)
Android Developer中也有比较详细的教程:
2) 蓝牙4.0 Ble
因为是低功耗的蓝牙 所以其传输速度也是慢很多 它的速度可设置 一般默认为连接间隔为 20 ms 每个无线包最大载荷为 20 个字节。也就是说 理想速度为20byte/20ms 实际上其传输速度是会变化的 (20byte/30ms~到20byte/50ms之间)
当然Android Developer中也有教程但是没有中文的:
ble蓝牙开发流程:
1、首先当然是进行权限申请啦:
在AndroidManifest 中添加
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> //蓝牙设置 、扫描
Android 6.0后面版本需要添加位置权限才可扫描到设备
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Android10(Q)扫描需要打开位置信息 不然扫描不到蓝牙
官方的提示
位置权限为私密权限6.0后需要动态申请(我使用RxPermissions 申请权限)
public void requestMustPermissionsEach(String permission, OnPermissionListener listener) {
mRxPermissions
.requestEach(permission)
.subscribe(permission1 -> {
if (listener != null) {
if (permission1.granted) {
// 'permission' 授权通过!
} else if (permission1.shouldShowRequestPermissionRationale) {
//拒绝 没有点击不再提醒
} else {
//拒接 点击不在提醒
}
}
});
}
在AndroidManifest 中声明应用只支持蓝牙4.0
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
或者在代码中进行判断
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
}
2、获取蓝牙适配器 BluetoothAdapter
BluetoothAdapter mBleAdapter = BluetoothAdapter.getDefaultAdapter();
3、打开蓝牙
public void openBle() {
if (!mBleAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//REQUEST_ENABLE_BT 是设置 requestCode 以便在onActivityResult判断为蓝牙打开结果
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
}
4、关闭蓝牙
public void closeBle() {
if (mBleAdapter != null) {
mBleAdapter.disable();
}
}
5、在onActivityResult中获取打开蓝牙结果 (蓝牙的状态也会通过广播方式返回)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//打开蓝牙成功
if (requestCode == BleSearchPresenter.REQUEST_ENABLE_BT && resultCode == Activity.RESULT_OK) {
//执行蓝牙打开后的操作
}
}
6、成功打开蓝牙后就可以进行蓝牙的扫描操作了
在 5.0 后有新的扫描方法 在之前的被弃用了 (官方不推荐使用)
5.0之前的扫描方式
public void startSearchBle() {
if (!mBleAdapter.isEnabled()) {
openBle();
return;
}
//暂停扫描需要用到mLeScanCallback 所以定义为全局变量 扫描结果在此回调
mLeScanCallback = (device, rssi, scanRecord) -> {
//device 为扫描到的蓝牙设备属性
//rssi 为扫描到蓝牙信号
//scanRecord 扫描结果的列表
String BleMac = device.getAddress();//蓝牙物理地址 连接蓝牙是会用到
String BleName = device.getName();//蓝牙名称
};
mBleAdapter.startLeScan(mLeScanCallback);
}
5.0之后的扫描方式
public void startSearchBle() {
if (!mBleAdapter.isEnabled()) {
openBle();
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBleScanner = mBleAdapter.getBluetoothLeScanner();
mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
//扫描结果的返回
//获取蓝牙设备
BluetoothDevice btDevice = result.getDevice()
//获取蓝牙信号
int rssi = result.getRssi()
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
mBleScanner.startScan(mScanCallback);
}
}
7、接下来就是关闭扫描蓝牙 其5.0之后也是有变化
5.0之前
public void stopSearchBle() {
if (mLeScanCallback != null) {
mBleAdapter.stopLeScan(mLeScanCallback);
mLeScanCallback = null;
}
}
5.0之后
public void stopSearchBle() {
if (mBleScanner != null && mScanCallback != null) {
mBleScanner.stopScan(mScanCallback);
mScanCallback = null;
}
}
8、连接蓝牙准备
1)需要蓝牙的物理地址进行连接蓝牙
蓝牙的物理地址可通过蓝牙扫描时 获得的device 中获取mac地址