商米扫码
为什么要使用商米封装的扫码SDK
商米提供了适配自己设备的扫码SDK,相对于目前使用的开源方案,商米的扫码SDK有以下5个优势
- 识别率高,经过大量模拟真实场景的测试,商米扫码SDK相对普遍使用的基于ZXing开源项目的扫码方案在扫码识别率上平均提高了74%。
- 比ZXing方案在一维码扫码速度上快了100%以上。
- 使用方式更简单,5行代码就能在自己的项目中添加扫码功能。
- 支持扫描多达15种码,后续还将添加更多的码种。
- 与商米的设备完美适配,软硬件结合可以保证功能的高效稳定。
怎么使用商米的扫码SDK
开发者有两种方式使用商米的扫码SDK
- 开发者的应用调用SUNMIUI系统集成的扫码模块完成扫码,获取返回值,该方法简单易用。
- 自己写相机界面,调用商米的封装的扫码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);
}
第二种方式:
1. 在项目的libs目录中按以下层级添加libiconv.so,libscaninit.so,libsunmiscan.so和sunmiscan.jar四个库文件。
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;
3. 初始化和配置。
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);
/*解码,返回值为 0 代表失败,>0 表示成功*/
int result = scanner.scanImage(source);
5.获取解码结果和条码类型。
if (result != 0) {
SymbolSet syms = scanner.getResults();
for (Symbol sym : syms) {
Log.i("sunmi", "码型:"+sym.getSymbolName());//条码类型,如“EAN-8”
Log.i("sunmi","结果:"+sym.getResult())//获取解码结果字符串,这里就是要获取的结果
}
}
更多说明
商米扫码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