Fetch the repository succeeded.
This action will force synchronization from 一头不安分的蜗牛/classic-bluetooth, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
//纯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'
}
}
}
dependencies {
...
implementation 'cn.wandersnail:classic-bluetooth:latestVersion'
//额外依赖
implementation 'cn.wandersnail:commons-android:latestVersion'
}
allprojects {
repositories {
...
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
实例化有两种方式:
//实例化并初始化
BTManager.getInstance().initialize(application);
BTManager manager = BTManager.getBuilder()
.setExecutorService(executorService)//自定义线程池用来执行后台任务,也可使用默认
.setObserveAnnotationRequired(false)//不强制使用{@link Observe}注解才会收到被观察者的消息,强制使用的话,性能会好一些
.setMethodDefaultThreadMode(ThreadMode.MAIN)//指定回调方法和观察者方法的默认线程
.build();
manager.initialize(application);
//如果中途需要修改配置重新实例化,调用此方法后即可重新构建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);
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);
//UUIDWrapper.useDefault(),使用默认的UUID(00001101-0000-1000-8000-00805f9b34fb)
//UUIDWrapper.useCustom(),自定义UUID
connection = BTManager.getInstance().createConnection(device, UUIDWrapper.useDefault(), observer);//观察者监听连接状态
connection.connect(new ConnectCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFail(@NonNull String errMsg, @Nullable Throwable e) {
}
});
BTManager.getInstance().disconnectConnection(device, UUIDWrapper.useDefault());//断开指定设备的指定UUID的连接
//BTManager.getInstance().disconnectAllConnections();//断开所有连接
BTManager.getInstance().releaseConnection(device, UUIDWrapper.useDefault());//释放指定设备的指定UUID的连接
//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里接收写入结果。
BTManager.getInstance().release();
-keep class * implements cn.wandersnail.commons.observer.Observe {
public <methods>;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。