栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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    librarysrcmainjavacomftsafeepaypossdkapiimplFTePayPosSdkImpl.java
java jniScan
java library jniScan
c library jniScan
c D:03ePayPOS600Android_SDKFT600baseDemolibrarysrcmaincppbaseAPIEPayPosDeviceWrapper.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 btcommlibsrcmainjavacomftsafebluetoothsdkscanclassicClassicBluetoothScan.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点打印机就正常。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343252.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号