ZXing库的使用及相应的修改

本文介绍如何将ZXing二维码扫描库从默认的横屏模式调整为竖屏模式,并解决过程中遇到的各种问题,包括相机角度调整、扫描结果处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中需要一个二维码扫描,以前集成过由于时间太长忘记了,于是去github上去寻找ZXing的项目demo,这里把源项目的地址和我修改后的项目地址列举了下来,有需要的小伙伴可以去下载,源项目是eclipse的工程,需要小伙伴自行转成android studio项目;我修改后的项目是android studio 工程小伙伴们下载下来只需要修改扫描后的结果处理即可使用。

地址如下:

ZXing官方Demo和文档

ZXing可直接使用的library

下面就把我修改的位置列出来,供想自己修改的小伙伴们做参考。

1.横屏变竖屏

首先官方下载下来的demo是横屏的效果,但是我们应用使用的是竖屏的,这里就要修改成竖屏方式,只在清单文件中(AndroidManifest.xml)中找到CaptureActivity中的属性改成

	android:screenOrientation="portrait"

此时运行界面的确是横屏了,但是扫描去不好使了,原因在与相机,界面转过去了但是相机并没有旋转,相机还在横屏的状态,所以此是需要更改的是相机的角度。

2.相机的角度问题

首先在 CaptureActivityOnResume方法中的

if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
            setRequestedOrientation(getCurrentOrientation());
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        }

注释掉,在onCreate方法中添加(判断手机屏幕状态)

	if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
	} else {
    		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
	}
随后在 carmera包中 CameraConfigurationManagersetDesiredCameraParameters方法中

	parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y);
这句代码下添加如下代码

	//add 这句代码作用是旋转镜头90度,使相机预览方向正确显示
	theCamera.setDisplayOrientation(90);
    完成上述操作扫码基本好使了,但是你会发现"咦?怎么条形码不好使了呢" 于是乎还需要继续更改,在camra包的CameraManager
的getFramingRectInPreview方法中的
	rect.left = rect.left * cameraResolution.x / screenResolution.x;
	rect.right = rect.right * cameraResolution.x / screenResolution.x;
	rect.top = rect.top * cameraResolution.y / screenResolution.y;
	rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
修改成
	rect.left = rect.left * cameraResolution.y / screenResolution.x;
	rect.right = rect.right * cameraResolution.y / screenResolution.x;
	rect.top = rect.top * cameraResolution.x / screenResolution.y;
	rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
在根目录下的DecodeHandler类的decode方法的
	PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
上面添加
	byte[] rotatedData = new byte[data.length];
	for (int y = 0; y < height; y++) {
   	  for (int x = 0; x < width; x++)
        	rotatedData[x * height + height - y - 1] = data[x + y * width];
	}
	int tmp = width;
	width = height;
	height = tmp;
	data = rotatedData;
此刻关于扫描的问题都解决了,最后的问题是图片变形的问题,我看了网上很多的文章修改后都无效,最后找到修改的地方特此分享
camera包的CameraConfigurationUtilsfindBestPreviewSizeValue方法最后添加
	Point screenResolutionForCamera = new Point();
	screenResolutionForCamera.x = screenResolution.x;
	screenResolutionForCamera.y = screenResolution.y;
	// preview size is always something like 480*320, other 320*480
	if (screenResolution.x < screenResolution.y) {
   	 screenResolutionForCamera.x = screenResolution.y;
    	screenResolutionForCamera.y = screenResolution.x;
	}
	return screenResolutionForCamera;
结果集处理在CaptureActivityhandleDecode方法中,下面是按照我的需求处理的
  	if (rawResult.getText().contains("@")) {
            //获取@
            int position = rawResult.getText().indexOf("@");
            //首个点的位置
            int ponit = rawResult.getText().indexOf(".");
            String result = rawResult.getText().substring(position + 1, ponit);
            Toast.makeText(this, "截取结果:" + rawResult.getText()
                    .substring(position + 1, ponit), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent();
            intent.putExtra("result", result);
            setResult(RESULT_OK, intent);
            finish();
        } else {
            Toast.makeText(this, "未知条码", Toast.LENGTH_SHORT).show();
            onKeyDown(KeyEvent.KEYCODE_BACK, null);
        }
	注:如果出现" An error occurred while connecting to camera"是因为你的相机权限没有开启。
     这就是整个修改的流程,希望对有需要的小伙伴有帮助,若有什么遗漏请指出,
希望可以共同进步。

ZXing一维码/二维码 使用文档 样例: System.IO.Stream stmYiWei = new System.IO.MemoryStream(); BitMatrix byteMatrix = new MultiFormatWriter().encode(sCode, BarcodeFormat.CODE_39, 230, 40); toBitmap(byteMatrix).Save(stmYiWei, ImageFormat.Bmp); Byte[] byteYiWei = new byte[stmYiWei.Length]; stmYiWei.Position = 0; stmYiWei.Read(byteYiWei, 0, (int)stmYiWei.Length); //将图片文件流保存为二进制文件以便保存到数据中 System.IO.Stream stmErWei = new System.IO.MemoryStream(); IDictionary hints = new Dictionary(); hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8"); byteMatrix = new MultiFormatWriter().encode(sTmp, BarcodeFormat.QR_CODE, 200, 200, hints); toBitmap(byteMatrix).Save(stmErWei, ImageFormat.Bmp); Byte[] byteErWei = new byte[stmErWei.Length]; stmErWei.Position = 0; stmErWei.Read(byteErWei, 0, (int)stmErWei.Length); //将图片文件流保存为二进制文件以便保存到数据中 strSQL = "insert into gdzc_biaoqian( bq_gd_no,bq_yiweima,bq_erweima,bq_us_no) values("; strSQL = strSQL + " @bq_gd_no,@bq_yiweima,@bq_erweima,@bq_us_no)"; SqlCommand commandImage = new SqlCommand(strSQL, connectionImage); commandImage.Parameters.Clear(); commandImage.Parameters.Add("@bq_gd_no", SqlDbType.Int).Value = Convert.ToInt32(sGdzcNo); commandImage.Parameters.Add("@bq_yiweima", SqlDbType.Image).Value = byteYiWei; commandImage.Parameters.Add("@bq_erweima", SqlDbType.Image).Value = byteErWei; commandImage.Parameters.Add("@bq_us_no", SqlDbType.Int).Value = Convert.ToInt32(Session["LoginUserID"]); commandImage.ExecuteNonQuery(); commandImage.Dispose();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值