天天看点

解决经典蓝牙扫描时手工意外中止应用,再次扫描失败等bug总结。bug2描述:

bug描述:第一次扫描进行中,手工杀掉应用,再打开应用,再搜就搜失败。原生api 返回false。

解决经典蓝牙扫描时手工意外中止应用,再次扫描失败等bug总结。bug2描述:

 分析:原生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模式来编译。

解决经典蓝牙扫描时手工意外中止应用,再次扫描失败等bug总结。bug2描述:
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。

解决经典蓝牙扫描时手工意外中止应用,再次扫描失败等bug总结。bug2描述:
解决经典蓝牙扫描时手工意外中止应用,再次扫描失败等bug总结。bug2描述:

bug2描述:

任务处理很快完成时,任务开始处理函数跑到任务结束处理函数之后了。这样改就正常了: 

解决经典蓝牙扫描时手工意外中止应用,再次扫描失败等bug总结。bug2描述:

 bug3描述:300点的标签打印机打印图片有锯齿,用600点打印机就正常。