Bitmap Mode相机扫码提供decode和decodeWithBitmap两种扫码接口。decode接口可以支持自定义相机输出的NV21图像数据,同时支持多码。decodeWithBitmap接口需要将相机图像转为Bitmap格式。2.11.0.300及以上版本推荐使用decode扫码接口,可以减少图像转换时间,提高相机扫码整体速度。
使用Bitmap相机扫码的主要业务流程如下:

2.11.0.300及以上版本推荐使用。
“Java”
// 将相机的data数组转化成ByteArrayOutputStream流。data为byte数组的实例,camera为android.hardware.Camera的实例
YuvImage yuv = new YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width,
camera.getParameters().getPreviewSize().height, null); “Kotlin”
// 将相机的data数组转化成ByteArrayOutputStream流。data为byte数组的实例,camera为android.hardware.Camera的实例
val yuv = YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width,
camera.getParameters().getPreviewSize().height, null) “Java”
HmsScanFrame frame= new HmsScanFrame(yuv); “Kotlin”
val frame = HmsScanFrame(yuv) “Java”
// “QRCODE_SCAN_TYPE”和“PDF417_SCAN_TYPE”表示只扫描QR和PDF417的码
HmsScanFrameOptions option = new HmsScanFrameOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE| HmsScan.PDF417_SCAN_TYPE).setMultiMode(false).setParseResult(true).setPhotoMode(true).create(); “Kotlin”
// “QRCODE_SCAN_TYPE”和“PDF417_SCAN_TYPE”表示只扫描QR和PDF417的码
val option = HmsScanFrameOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE| HmsScan.PDF417_SCAN_TYPE).setMultiMode(false).setParseResult(true).setPhotoMode(true).create() “Java”
HmsScanResult result = ScanUtil.decode(BitmapActivity.this, frame, option);
HmsScan[] hmsScans = result.getHmsScans();
// 扫码成功时处理解码结果
if (hmsScans != null && hmsScans.length > 0 && !TextUtils.isEmpty(hmsScans[0].getOriginalValue())) {
// 展示扫码结果
...
}
// zoomValue大于1.0时,根据getZoomValue()调整焦距重新扫码
if (hmsScans != null && hmsScans.length > 0 && TextUtils.isEmpty(hmsScans[0].getOriginalValue()) && hmsScans[0].getZoomValue() != 1.0) {
// 设置相机焦距,相机重新生成Bitmap继续扫码(convertZoomInt()将放大倍数转化为相机接收的焦距参数)
Camera.Parameters parameters= camera.getParameters();
parameters.setZoom(convertZoomInt(hmsScans[0].getZoomValue()));
camera.setParameters(parameters);
} “Kotlin”
val hmsScansResult= ScanUtil.decode(this@BitmapActivity, frame, options)
val hmsScans = hmsScansResult.hmsScans
// 扫码成功时处理解码结果
if (hmsScans != null && hmsScans.size > 0 && !TextUtils.isEmpty(hmsScans[0].getOriginalValue())) {
// 展示扫码结果
...
}
// zoomValue大于1.0时,根据getZoomValue()调整焦距重新扫码
if (hmsScans != null && hmsScans.size > 0 && TextUtils.isEmpty(hmsScans[0].getOriginalValue()) && hmsScans[0].getZoomValue() != 1.0) {
// 设置相机焦距,相机重新生成Bitmap继续扫码(convertZoomInt()将放大倍数转化为相机接收的焦距参数)
var parameters= camera.getParameters()
parameters.setZoom(convertZoomInt(hmsScans[0].getZoomValue()))
camera.setParameters(parameters)
} “Java”
// 将相机的data数组转化成ByteArrayOutputStream流。data为byte数组的实例,camera为android.hardware.Camera的实例
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); “Kotlin”
// 将相机的data数组转化成ByteArrayOutputStream流。data为byte数组的实例,camera为android.hardware.Camera的实例
val yuv = YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width,
camera.getParameters().getPreviewSize().height, null)
val stream = ByteArrayOutputStream()
yuv.compressToJpeg(Rect(0, 0, camera.getParameters().getPreviewSize().width,
camera.getParameters().getPreviewSize().height), 100, stream) “Java”
Bitmap bitmap = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.toByteArray().length); “Kotlin”
val bitmap = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.toByteArray().size) 您可以通过如下方式设置可选参数。
“Java”
// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只扫描QR和DataMatrix的码
HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).setPhotoMode(false).create(); “Kotlin”
// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只扫描QR和DataMatrix的码
val options = HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).setPhotoMode(false).create() “Java”
HmsScan[] hmsScans = ScanUtil.decodeWithBitmap(BitmapActivity.this, bitmap, options);
// 扫码成功时处理解码结果
if (hmsScans != null && hmsScans.length > 0 && !TextUtils.isEmpty(hmsScans[0].getOriginalValue())) {
// 展示扫码结果
...
}
// zoomValue大于1.0时,根据getZoomValue()调整焦距重新扫码
if (hmsScans != null && hmsScans.length > 0 && TextUtils.isEmpty(hmsScans[0].getOriginalValue()) && hmsScans[0].getZoomValue() != 1.0) {
// 设置相机焦距,相机重新生成Bitmap继续扫码(convertZoomInt()将放大倍数转化为相机接收的焦距参数)
Camera.Parameters parameters= camera.getParameters();
parameters.setZoom(convertZoomInt(hmsScans[0].getZoomValue()));
camera.setParameters(parameters);
} “Kotlin”
val hmsScans = ScanUtil.decodeWithBitmap(this@BitmapActivity, bitmap, options)
// 扫码成功时处理解码结果
if (hmsScans != null && hmsScans.size > 0 && !TextUtils.isEmpty(hmsScans[0].getOriginalValue())) {
// 展示扫码结果
...
}
// zoomValue大于1.0时,根据getZoomValue()调整焦距重新扫码
if (hmsScans != null && hmsScans.size > 0 && TextUtils.isEmpty(hmsScans[0].getOriginalValue()) && hmsScans[0].getZoomValue() != 1.0) {
// 设置相机焦距,相机重新生成Bitmap继续扫码(convertZoomInt()将放大倍数转化为相机接收的焦距参数)
var parameters= camera.getParameters()
parameters.setZoom(convertZoomInt(hmsScans[0].getZoomValue()))
camera.setParameters(parameters)
} “Java”
public int convertZoomInt(double zoomValue) {
// 计算相机预览缩放值,parameters为相机参数
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;
} “Kotlin”
public fun convertZoomInt(zoomValue:Double):Int {
// 计算相机预览缩放值,parameters为相机参数
val allZoomRatios = parameters.getZoomRatios()
val maxZoom = Math.round(allZoomRatios.get(allZoomRatios.size() - 1) / 100f)
if (zoomValue >= maxZoom) {
return allZoomRatios.size() - 1
}
for (i in 1 until allZoomRatios.size) {
if (allZoomRatios.get(i) >= (zoomValue * 100) && allZoomRatios.get(i - 1) <= (zoomValue * 100)) {
return i
}
}
return -1
}