最近项目中需要一个二维码扫描,以前集成过由于时间太长忘记了,于是去github上去寻找ZXing的项目demo,这里把源项目的地址和我修改后的项目地址列举了下来,有需要的小伙伴可以去下载,源项目是eclipse的工程,需要小伙伴自行转成android studio项目;我修改后的项目是android studio 工程小伙伴们下载下来只需要修改扫描后的结果处理即可使用。
地址如下:
ZXing官方Demo和文档
ZXing可直接使用的library
下面就把我修改的位置列出来,供想自己修改的小伙伴们做参考。
1.横屏变竖屏
首先官方下载下来的demo是横屏的效果,但是我们应用使用的是竖屏的,这里就要修改成竖屏方式,只在清单文件中(AndroidManifest.xml)中找到CaptureActivity中的属性改成
android:screenOrientation="portrait"
此时运行界面的确是横屏了,但是扫描去不好使了,原因在与相机,界面转过去了但是相机并没有旋转,相机还在横屏的状态,所以此是需要更改的是相机的角度。
2.相机的角度问题
首先在 CaptureActivity中OnResume方法中的
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包中 CameraConfigurationManager类 setDesiredCameraParameters方法中
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包的CameraConfigurationUtils的findBestPreviewSizeValue方法最后添加
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;结果集处理在CaptureActivity中handleDecode方法中,下面是按照我的需求处理的
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"是因为你的相机权限没有开启。
这就是整个修改的流程,希望对有需要的小伙伴有帮助,若有什么遗漏请指出,
希望可以共同进步。