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

121 篇文章 4 订阅
88 篇文章 8 订阅

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点打印机就正常。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值