经典蓝牙android,classic-bluetooth

本文介绍了一个支持多设备连接的Android经典蓝牙框架,该框架采用观察者模式,支持使用注解来控制回调线程,并提供了搜索、连接、读写数据等功能的详细使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android传统(经典)蓝牙框架

最新版本

badge.svg

download.svg

%E6%BA%90%E7%A0%81-github-blue.svg

%E6%BA%90%E7%A0%81-%E7%A0%81%E4%BA%91-red.svg

功能

支持多设备同时连接

支持观察者监听或回调方式。注意:观察者监听和回调只能取其一!

支持使用注解@RunOn控制回调线程

支持设置回调或观察者的方法默认执行线程

配置

因为使用了jdk8的一些特性,需要在module的build.gradle里添加如下配置:

//纯java的项目

android {

compileOptions {

sourceCompatibility JavaVersion.VERSION_1_8

targetCompatibility JavaVersion.VERSION_1_8

}

}

//有kotlin的项目还需要在project的build.gradle里添加

allprojects {

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {

sourceCompatibility = JavaVersion.VERSION_1_8

targetCompatibility = JavaVersion.VERSION_1_8

kotlinOptions {

jvmTarget = '1.8'

apiVersion = '1.3'

languageVersion = '1.3'

}

}

}

module的build.gradle中的添加依赖,自行修改为最新版本,同步后通常就可以用了:

dependencies {

...

implementation 'cn.wandersnail:classic-bluetooth:latestVersion'

//额外依赖

implementation 'cn.wandersnail:common-full:latestVersion'

}

如果从jcenter下载失败。在project的build.gradle里的repositories添加内容,最好两个都加上,添加完再次同步即可。

allprojects {

repositories {

...

mavenCentral()

maven { url 'https://dl.bintray.com/wandersnail/androidx/' }

}

}

使用方法

初始化SDK

实例化有两种方式:

使用默认方式自动构建实例,直接获取实例即可

//实例化并初始化

BTManager.getInstance().initialize(application);

构建自定义实例,必须在BTManager.getInstance()之前!!

BTManager manager = BTManager.getBuilder()

.setExecutorService(executorService)//自定义线程池用来执行后台任务,也可使用默认

.setObserveAnnotationRequired(false)//不强制使用{@link Observe}注解才会收到被观察者的消息,强制使用的话,性能会好一些

.setMethodDefaultThreadMode(ThreadMode.MAIN)//指定回调方法和观察者方法的默认线程

.build();

manager.initialize(application);

销毁SDK

//如果中途需要修改配置重新实例化,调用此方法后即可重新构建BTManager实例

BTManager.getInstance().destroy();

日志输出控制

BTManager.isDebugMode = true;;//开启日志打印

搜索设备

定义搜索监听器

Android6.0以上搜索需要至少模糊定位权限,如果targetSdkVersion设置29以上需要精确定位权限。权限需要动态申请

private DiscoveryListener discoveryListener = new DiscoveryListener() {

@Override

public void onDiscoveryStart() {

//搜索开始

}

@Override

public void onDiscoveryStop() {

//搜索停止

}

/**

* 搜索到蓝牙设备

*

* @param device 搜索到的设备

* @param rssi 信号强度

*/

@Override

public void onDeviceFound(@NonNull BluetoothDevice device, int rssi) {

//搜索结果

}

@Override

public void onDiscoveryError(int errorCode, @NotNull String errorMsg) {

switch(errorCode) {

case ScanListener.ERROR_LACK_LOCATION_PERMISSION://缺少定位权限

break;

case ScanListener.ERROR_LOCATION_SERVICE_CLOSED://位置服务未开启

break;

case ScanListener.ERROR_SCAN_FAILED://搜索失败

break;

}

}

};

添加监听

BTManager.getInstance().addDiscoveryListener(discoveryListener);

开始搜索

BTManager.getInstance().startDiscovery();

停止搜索

BTManager.getInstance().stopDiscovery();

停止监听

BTManager.getInstance().removeDiscoveryListener(discoveryListener);

观察者模式数据及事件

定义观察者。实现EventObserver接口即可:

public class MainActivity extends AppCompatActivity implements EventObserver {

/**

* 使用{@link Observe}确定要接收消息,{@link RunOn}指定在主线程执行方法,设置{@link Tag}防混淆后找不到方法

*/

@Tag("onConnectionStateChanged")

@Observe

@RunOn(ThreadMode.MAIN)

@Override

public void onConnectionStateChanged(@NonNull BluetoothDevice device, int state) {

switch (state) {

case Connection.STATE_CONNECTING:

break;

case Connection.STATE_PAIRING:

break;

case Connection.STATE_PAIRED:

break;

case Connection.STATE_CONNECTED:

break;

case Connection.STATE_DISCONNECTED:

break;

case Connection.STATE_RELEASED:

break;

}

}

/**

* 如果{@link BTManager.Builder#setObserveAnnotationRequired(boolean)}设置为false时,无论加不加{@link Observe}注解都会收到消息。

* 设置为true时,必须加{@link Observe}才会收到消息。

* 默认为false,方法默认执行线程在{@link BTManager.Builder#setMethodDefaultThreadMode(ThreadMode)}指定

*/

@Observe

@Override

public void onRead(@NonNull BluetoothDevice device, @NonNull byte[] value) {

Log.d("BTManager", "收到数据:" + StringUtils.toHex(value, " "));

}

@Override

public void onWrite(@NonNull BluetoothDevice device, @NonNull String tag, @NonNull byte[] value, boolean result) {

Log.d("BTManager", "写入结果:" + result);

}

}

注册观察者

BTManager.getInstance().registerObserver(observer);

取消注册观察者

BTManager.getInstance().unregisterObserver(observer);

连接

建立连接

connection = BTManager.getInstance().createConnection(device, observer);//观察者监听连接状态

//如果传null,默认使用{@link #SPP_UUID}连接

connection.connect(uuid, new ConnectCallback() {

@Override

public void onSuccess() {

}

@Override

public void onFail(@NonNull String errMsg, @Nullable Throwable e) {

}

});

断开连接,还可再次连接

BTManager.getInstance().disconnectConnection(device);//断开指定连接

//BTManager.getInstance().disconnectAllConnections();//断开所有连接

释放连接,不可重连,需要重新建立连接

BTManager.getInstance().releaseConnection(device);//释放指定连接

//BTManager.getInstance().releaseAllConnections();//释放所有连接

读写数据

接收数据

上面说到的定义观察者。实现EventObserver接口,在onRead里接收数据。

写入数据

两种方式:

2.1 接口回调方式

/**

* 写数据,加入队列尾部

*

* @param tag 数据标识

* @param value 要写入的数据

* @param callback 写入回调。不为null时,写入结果以回调返回;传null时,写入结果以通知观察者方式返回

*/

connection.write(tag, value, new WriteCallback() {

@Override

public void onWrite(@NonNull BluetoothDevice device, @NonNull String tag, @NonNull byte[] value, boolean result) {

}

});

/**

* 写数据,加入队列最前

*

* @param tag 数据标识

* @param value 要写入的数据

* @param callback 写入回调。不为null时,写入结果以回调返回;传null时,写入结果以通知观察者方式返回

*/

connection.writeImmediately(tag, value, new WriteCallback() {

@Override

public void onWrite(@NonNull BluetoothDevice device, @NonNull String tag, @NonNull byte[] value, boolean result) {

}

});

2.2 使用观察者模式接收结果

和接收数据一样,定义观察者。实现EventObserver接口,在onWrite里接收写入结果。

释放SDK,释放后必须重新初始化后方可使用

BTManager.getInstance().release();

代码混淆

-keep class * implements cn.wandersnail.commons.observer.Observe {

public ;

}

Demo效果预览

7f3e6e97beb25078f65e8a52c1d56b9c.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值