1 项目需求
最近项目中有个需求:使用原生相机在预览界面进行识别二维码和图片处理。其实这个需求不是很难,难在对预览画面的处理过程。
自己针对这个需求写了一个工具类,便于后续进行复盘,同时也分享给有类似需求的伙伴们。
2 遇到的问题
2.1 二维码识别成功率低
使用了第三方库,二维码成功率应该没有90%。我们客户要求比较高,二维码识别成功率要求几乎100%。后面会给出关键核心代码。现在先给出成功率不高的代码。
这里使用的第三方库是:
implementation ‘com.google.zxing:core:3.4.1’
implementation ‘com.journeyapps:zxing-android-embedded:3.6.0’
... 省略工具类其他部分代码,只看二维码识别部分代码
private final Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = parameters.getPreviewSize();
// 二维码识别
decodeQRCode(data, size.width, size.height);
}
};
/** 二维码识别 */
private void decodeQRCode(byte[] data, int width, int height) {
MultiFormatReader reader = new MultiFormatReader();
try {
PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height,
0, 0, width, height, false
);
Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(source)));
if (result != null){
Log.e(TAG, "扫码结果 = " + result.getText());
}
if (result != null && result.getText().length() > 0) {
if (callback != null) {
callback.onQRCodeScanned(true, result.getText());
}
} else {
if (callback != null) {
callback.onQRCodeScanned(false, "");
}
}
} catch (Exception e) {
Log.e(TAG, "扫码异常 = " + e.getMessage());
if (callback != null) {
callback.onQRCodeScanned(false, "");
}
}
}
2.2 相机预览没物体时偶尔出现画面模糊
如下图。偶尔出现这样模糊画面。
3 相机工具类核心代码
实现主要流程:
1 打开相机
2 Camera 相关设置
3 预览时数据处理
4 关闭相机
/**
* @author linvisf
*
* description: 相机工具类
* //分辨率 1920 * 1088 1920 * 1080 1440 * 1080 1280 * 720 720 * 480 640 * 480 352 * 288 320 * 240
*/