bug描述:第一次扫描进行中,手工杀掉应用,再打开应用,再搜就搜失败。原生api 返回false。
分析:原生api不太可能有错误,说明有些状态没清除,在扫描之前要先初始一些东西。比如上次扫描没中止(特征是startDiscovery()直接返回false),或没有注销action接收器(特征是搜不到东西,搜到的被别的接收器接收了)。
跟踪:
跟踪bug :
项目结构:app java------library库模块 jni cpp------btcommlib库模块 jni cpp------java
app ePayPOS600BaseDemo
用户点Open Device click.openDevice()
java openDevice
java doScanDevice
java sdkInterface 接口scanDevice
java SdkHelper getSdkInterface
library模块
FTePayPosSdkImpl scanDevice \library\src\main\java\com\ftsafe\epaypos\sdk\api\impl\FTePayPosSdkImpl.java
java jniScan
java library jniScan
c library jniScan
c D:\003ePayPOS600\Android_SDK\FT600BaseDemo\library\src\main\cpp\baseAPI\EPayPosDeviceWrapper.cpp Scan
c SPscan
c SCscan
.h BTManager btStartScan
btcommlib模块
BTManager.c btStartScan
c jm_StartScan ftBTKeyComm_StartScan
java ftBTKeyComm_StartScan
java btCommStartScan
java 接口IBluetoothScan.startBtScan
接口实现
这里是蓝牙3.0 ClassicBluetoothScan.startBtScan java \btcommlib\src\main\java\com\ftsafe\bluetooth\sdk\scan\classic\ClassicBluetoothScan.java startBtScan 95返回的错误
如果蓝牙4.0及以后 是LeBluetoothScan.startBtScan
boolean actRes = mBtAdapter.startDiscovery(); 这里返回 false 就变成了失败
destroyBtScan之前再调用就会false destroyBtScan执行后会每次都是正常true
说明有些状态没清除,在扫描之前要先初始一些东西。比如上次扫描没中止。
btCommstopScan enter 执行了
BtLog.i(TAG, "stopBtScan enter"); 没执行
cancelDiscovery() 没执行
解决:
在startBtScan开始查找之前 获得mBtAdapter之后先判断 正在扫描就先关了 ,注销action接收器。就这两东西。
解决:有扫描之前调用 下面的stopBtScan()就行了,多次调用也可以,demo不用改。
void stopBtScan() {
BtLog.i(TAG, "stopBtScan enter");
// 关闭服务查找
if (mBtAdapter!=null && mBtAdapter.isDiscovering()) {
boolean actRes = mBtAdapter.cancelDiscovery();
if(!actRes)
{
BtLog.e(TAG, "cancelDiscovery:"+actRes );
}
}
// 注销action接收器
if (mContext != null &&mBtScanReceiver!=null) {
mContext.getApplicationContext().unregisterReceiver(mBtScanReceiver);
}
}
中间遇到两问题:
1.调试进不了jni及之后的代码?
可以调试,需要把sdk也用debug模式来编译。
ULONG ret = env->CallIntMethod(m_BluetoothKey, jm_StartScan, devType, false, scanTimeout);
可以调试,app java跳SDK库java,SDK库java跳库jni,SDK库jni跳蓝牙库jni,再从蓝牙jni里就跳不回蓝牙库java部分调试了,但是会执行。从蓝牙java跳到app java在app可以调试继续。
2.直接使用project,不使用jar,签名时release apk报有个enum变量报错:重复定义?jar后再打包正常。输出签名打包debug apk也正常 ,release apk不行。
implementation files('libs\\FT_600_SDK_V1.0.2.03_20211021.jar')
//implementation project(path: ':library')
其它需改进:
1.自动签名打包
2.自动清理
以下是可以删的文件及文件夹。根目录.gradle .idea build release 和app目录下build。
bug2描述:
任务处理很快完成时,任务开始处理函数跑到任务结束处理函数之后了。这样改就正常了:
bug3描述:300点的标签打印机打印图片有锯齿,用600点打印机就正常。