ZXing库的使用及相应的修改

最近项目中需要一个二维码扫描,以前集成过由于时间太长忘记了,于是去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"是因为你的相机权限没有开启。
     这就是整个修改的流程,希望对有需要的小伙伴有帮助,若有什么遗漏请指出,
 
  
希望可以共同进步。

你可能感兴趣的:(android)