Bitmap Mode需要开发者自行控制相机。提供相机扫码和导入图片扫码两种模式,需要开发者在调用扫码接口时设置。针对两种模式,Scan Kit扫码算法有针对性优化,正确设置您的使用模式将提升实际体验。
业务流程
使用Bitmap相机扫码模式的主要业务流程如下:
1. 用户打开应用发起扫码请求。
2. 校验是否有相机权限。
3. 权限验证通过后,调用HMS SDK的“decodeWithBitmap”扫码接口。
4. 返回扫码结果。
5. 判断扫码结果是否有效,结果有效则处理扫码结果。如果接收到的“zoomValue”大于1.0,代表当前扫描的码过小,需要按照这个值调整焦距后重新扫码。
6. 应用封装扫码结果返回给用户。

开发步骤
1. 获取相机一帧图像。
- YuvImage yuv = new YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width,
- camera.getParameters().getPreviewSize().height, null);
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- yuv.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width,
- camera.getParameters().getPreviewSize().height), 100, stream);
2. 将相机数据转化为Bitmap。
- Bitmap bitmap = BitmapFactory.decodeByteArray(stream.toByteArray(), 0,stream.toByteArray().length);
3. 初始化“HmsScanAnalyzerOptions”,设置支持识别的码制式,设置Bitmap模式为相机扫码模式。
开发者可以通过如下方式设置可选参数,不需要定制如下参数时,可以跳过此步骤:
setHmsScanTypes():设置码制式,默认识别Scan Kit支持的码制式,指定特定码制式,可以提高扫码速度。
setPhotoMode(false):设置Bitmap模式,默认为相机扫码模式。
- //“QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只扫描QR和Data Matrix的码
- HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).setPhotoMode(false).create();
4. 调用“ScanUtil”的静态方法“decodeWithBitmap”方法发起扫码请求并获取扫码结果对象HmsScan,其中包含的信息请参考码值解析。
如果开发者不需要指定只检测特定的码制式,此处的“options”可以置为“null”。
如果用户扫描的码过小,Scan Kit会返回调整相机焦距的指令给App,需要App调整相机以便于获取到清晰的码图。
- HmsScan[] hmsScans = ScanUtil.decodeWithBitmap(BitmapActivity.this, bitmap, options);
- //扫码成功时处理解码结果
- if (hmsScans != null && hmsScans.length > 0 && !TextUtils.isEmpty(hmsScans[0].getOriginalValue())) {
- //展示扫码结果
- showResult(hmsScans);
- }
- //zoomValue大于1.0时,根据getZoomValue()调整焦距重新扫码
- if (hmsScans != null && hmsScans.length > 0 && TextUtils.isEmpty(hmsScans[0].getOriginalValue()) && hmsScans[0].getZoomValue() != 1.0) {
- //设置相机焦距,相机重新生成Bitmap继续扫码(convertZoomInt()将放大倍数转化为相机接收的焦距参数)
- params = camera.getParameters();
- params.setZoom(convertZoomInt(hmsScans[0].getZoomValue()));
- camera.setParameters(params);
- }
convertZoomInt()函数实现示例代码:
- public int convertZoomInt(double zoomValue) {
- List<Integer> allZoomRatios = parameters.getZoomRatios();
- float maxZoom = Math.round(allZoomRatios.get(allZoomRatios.size() - 1) / 100f);
- if (zoomValue >= maxZoom) {
- return allZoomRatios.size() - 1;
- }
- for (int i = 1; i < allZoomRatios.size(); i++) {
- if (allZoomRatios.get(i) >= (zoomValue * 100) && allZoomRatios.get(i - 1) <= (zoomValue * 100)) {
- return i;
- }
- }
- return -1;
- }
业务流程
使用Bitmap图片扫码模式的主要业务流程如下:
1. 用户打开应用发起扫码请求。
2. 校验是否有文件读取权限。
3. 权限验证通过后,调用HMS SDK的“decodeWithBitmap”扫码接口。
4. 返回扫码结果。
5. 应用封装扫码结果返回给用户。

开发步骤
1. 获取图片,将图片转化为Bitmap。
- Bitmap bitmap = MediaStore.Images.Media.getBitmap(BitmapActivity.this.getContentResolver(), data.getData());
2. 初始化“HmsScanAnalyzerOptions”,设置支持识别的码制式和设置Bitmap模式为图片扫码模式。
开发者可以通过如下方式设置可选参数,不需要定制如下参数时,可以跳过此步骤:
setHmsScanTypes():设置码制式,默认识别Scan Kit支持的码制式,指定扫码特定码制式,可以提高扫码速度。
setPhotoMode(true):设置图片扫码模式,默认为相机扫码模式。
- //“QRCODE_SCAN_TYPE ”和“ DATAMATRIX_SCAN_TYPE表示只扫描QR和Data Matrix的码
- HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).setPhotoMode(true).create();
3. 调用“ScanUtil”的静态方法“decodeWithBitmap”方法发起扫码请求并获取扫码结果对象HmsScan,其中包含的信息请参考码值解析。
如果开发者不需要指定只检测特定的码制式,此处的“options”可以置“null”。
- HmsScan[] hmsScans = ScanUtil.decodeWithBitmap(BitmapActivity.this, bitmap, options);
- //处理扫码结果
- if (hmsScans != null && hmsScans.length > 0) {
- //展示扫码结果
- showResult(hmsScans);
- }