商米扫码

为什么要使用商米封装的扫码SDK

商米提供了适配自己设备的扫码SDK,相对于目前使用的开源方案,商米的扫码SDK有以下5个优势

  1. 识别率高,经过大量模拟真实场景的测试,商米扫码SDK相对普遍使用的基于ZXing开源项目的扫码方案在扫码识别率上平均提高了74%。
  2. 比ZXing方案在一维码扫码速度上快了100%以上。
  3. 使用方式更简单,5行代码就能在自己的项目中添加扫码功能。
  4. 支持扫描多达15种码,后续还将添加更多的码种。
  5. 与商米的设备完美适配,软硬件结合可以保证功能的高效稳定。

怎么使用商米的扫码SDK

开发者有两种方式使用商米的扫码SDK

  1. 开发者的应用调用SUNMIUI系统集成的扫码模块完成扫码,获取返回值,该方法简单易用。
  2. 自己写相机界面,调用商米的封装的扫码SDK完成图片的解析,该方式相对复杂,但提供了更高的自由度。

第一种使用方式:

为了降低开发难度,商米在最新的SUNMI OS(V1固件版本187,M1固件版本37)系统中内置了一个扫码的模块,开发者在项目需要调用扫码的地方通过startActivityForResult()调用商米的扫码模块,然后在onActivityResult()方法中接受扫码结果返回值。

/**

	* 外部应用在自己的业务代码需要启动扫码的地方使用下面的方式创建Intent,

	* 然后使用startActivityForResult()调用起商米的扫码模块;

	*/

	Intent intent = new Intent("com.summi.scan");

	intent.setPackage("com.sunmi.sunmiqrcodescanner");

	        

	/**

	* 使用该方式也可以调用扫码模块

	*Intent intent = new Intent("com.summi.scan");

	*intent.setClassName("com.sunmi.sunmiqrcodescanner", 

	"com.sunmi.sunmiqrcodescanner.activity.ScanActivity");

	*/

	/**

	//扫码模块有一些功能选项,开发者可以通过传递参数控制这些参数,

	//所有参数都有一个默认值,开发者只要在需要的时候添加这些配置就可以。

	intent.putExtra("CURRENT_PPI", 0X0003);//当前分辨率 

	//M1和V1的最佳是800*480,PPI_1920_1080 = 0X0001;PPI_1280_720 = 

	//0X0002;PPI_BEST = 0X0003;

	intent.putExtra("PLAY_SOUND", true);// 扫描完成声音提示  默认true

	intent.putExtra("PLAY_VIBRATE", false);

	//扫描完成震动,默认false,目前M1硬件支持震动可用该配置,V1不支持

	intent.putExtra("IDENTIFY_INVERSE_QR_CODE", true);// 识别反色二维码,默认true

	intent.putExtra("IDENTIFY_MORE_CODE", false);// 识别画面中多个二维码,默认false        

	intent.putExtra("IS_SHOW_SETTING", true);// 是否显示右上角设置按钮,默认true

	intent.putExtra("IS_SHOW_ALBUM", true);// 是否显示从相册选择图片按钮,默认true

	*/
	startActivityForResult(intent, START_SCAN);           

在onActivityResult方法中接收返回的扫码结果参数,参考如下代码: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1 && data != null) { Bundle bundle = data.getExtras(); ArrayList> result = (ArrayList>) bundle .getSerializable("data"); Iterator> it = result.iterator(); while (it.hasNext()) { HashMap hashMap = it.next(); Log.i("sunmi", hashMap.get("TYPE"));//这个是扫码的类型 Log.i("sunmi", hashMap.get("VALUE"));//这个是扫码的结果 } } super.onActivityResult(requestCode, resultCode, data); }

 @Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 1 && data != null) {

Bundle bundle = data.getExtras();

ArrayList> result = (ArrayList>)

bundle .getSerializable(“data”);

Iterator> it = result.iterator();

while (it.hasNext()) {

HashMap hashMap = it.next();

Log.i(“sunmi”, hashMap.get(“TYPE”));//这个是扫码的类型

Log.i(“sunmi”, hashMap.get(“VALUE”));//这个是扫码的结果

}

}

super.onActivityResult(requestCode, resultCode, data);

}

第二种方式:

1. 在项目的libs目录中按以下层级添加libiconv.so,libscaninit.so,libsunmiscan.so和sunmiscan.jar四个库文件。

project

2. 在处理业务的代码中引入头文件和解码库,可以参照DEMO。

        import com.sunmi.scan.Config;

	import com.sunmi.scan.Image; 

	import com.sunmi.scan.ImageScanner; 

	import com.sunmi.scan.Symbol;

	import com.sunmi.scan.SymbolSet; 

        private ImageScanner scanner;//声明扫描器 

	scanner = new ImageScanner();//创建扫描器

	scanner.setConfig(0, Config.X_DENSITY, 2);//行扫描间隔

	scanner.setConfig(0, Config.Y_DENSITY, 2);//列扫描间隔

	scanner.setConfig(0, Config.ENABLE_MULTILESYMS, 0);

	//是否开启同一幅图一次解多个条码,0表示只解一个,1为多个

	scanner.setConfig(0, Config.ENABLE_INVERSE, 0);//是否解反色的条码  

        scanner.setConfig( Symbol.QRCODE,Config.ENABLE, 1);//允许识读QR码,默认1:允许

        scanner.setConfig( Symbol.PDF417,Config.ENABLE, 1);//允许识读PDF417码,默认0:禁止

        scanner.setConfig(Symbol.DataMatrix, Config.ENABLE, 1);//允许识读DataMatrix码,默认0:禁止

        scanner.setConfig(Symbol.AZTEC, Config.ENABLE, 1);//允许识读AZTEC码,默认0:禁止

4.传入图像数据和解码,以下的代码可以写在PreviewCallback.onPreviewFrame(byte[] data, Camera camera)方法中。

  /**
    *创建解码图像,width, height 分别为摄像头预览分辨率的宽度和高度,一般来说,分辨率越高图
    *像越清晰,但解码速度越慢。由于解码算法需要处理的是原始灰度数据,而预览图像的默认格式为 
    *YCbCr_420_SP,需要转换格式才能处理, 参数"Y800"表示待转换的图像格式。
    */
    Image source = new Image(width, height, "Y800");

    /**
    *设置扫描区域范围,为了较好的识读较长的一维码,扫描框的宽度不应过小,由于预览的图像为横屏, 
    *注意扫描区域需要转换为竖屏对应的位置 
    */
    Rect cropRect = finder_view.getScanImageRect(size.height, size.width);
    //finder_view为DEMO中自定义的扫码区域控件。
    source.setCrop(cropRect.top,cropRect.left,cropRect.height(),cropRect.width());

    /*填充图像数据,data 为摄像头原始数据*/
    source.setData(data); 

    int result = scanner.scanImage(source); 

5.获取解码结果和条码类型。

 {
         
      SymbolSet syms = scanner.getResults();
          for (Symbol sym : syms) {   
            Log.i("sunmi", "码型:"+sym.getSymbolName());//条码类型,如“EAN-8”
            Log.i("sunmi","结果:"+sym.getResult())//获取解码结果字符串,这里就是要获取的结果
            
            }

  }       

so更新记录

历史资源文件

版本更新内容
1.3.0 1.去掉libiconv.so,即解码库只有一个so文件libsunmiscan.so(包括32,64位平台)
2.解决内存泄漏问题
3.增加点阵打印QR码识读,开启方式scanner.setConfig(Symbol.QRCODE, Config.ENABLE_DPM,1);//允许识读点阵打印QR码,默认0:禁止
1.2.9 1.增加64位平台(arm64-v8a)解码库
2.去掉libscaninit.so,同时jar包去掉libscaninit.so库版本查询接口
3.jar包版本更新为1.1.1
4.修复若干由于增加64位解码库发现的兼容性问题
1.2.8 1.优化code39解析能力
2.针对银联扫码能力测试要求的部分修改,该版本已通过银联扫码能力测试和最佳实践测试
3. 增加ISBN10 ISBN13输出使能控制
1.2.6 1.增加解码结果字节模式输出接口
2.解决倾斜角度扫一维码偶现程序异常的问题
1.2.5 1. 增加解码结果字节模式输出接口
2.优化一维码定位算法和解码时间
1.2.4 1.解决码字符中有不可以显示字符导致的解码结果字符解析异常的问题
2.其他优化
1.2.2 1. 优化打开相册读取高分辨率的图片解码慢的问题
2.解决使用Android7.0后硬件管家的扫码成功后没有结果返回的问题,
1.2.1 1.新增支持的二维码DataMatrix和Aztec(默认关闭,需要设置开启识读)
2.支持识读缺损一个定位符的QR码的识读
3.解决因开启多码同时识读时的bug
1.1.0 1.一维码可360度识读,之前的版本只在接近水平垂直方向识读
2.QR码识别速度提升一倍
3.解决QR码混合编码(中英文等)译码出现的bug
4.解决PDF417测试出现的潜在内存异常风险(如除0,内存溢出等)
1.0.1 1.增加了二维码PDF417的解码算法(默认关闭,需要设置开启识读)
2.减少了部分一维码的误码率
3.对于比较长的一维码可以竖屏全屏读取
4.对于上下并排的多个一维码,优先读取中间的条码
5.一维码和QR码支持反色和镜像解码,PDF417支持镜像解码
6.增加了解码库版本查询功能
1.0.0基础版本, 支持识读二维码QR和10多种主流一维码

更多说明

商米扫码SDK目前支持的扫码类型包括如下:

  • 一维码: EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code39, Code93, Code128, ISBN10, ISBN13, DataBar, DataBar Expanded, Interleaved 2 of 5
  • 二维码: QR Code , PDF417,DataMatrix,AZTEC