项目中需要用到条码扫描功能,花了小半天时间才把zxing整合到项目中。以下说下整合的经验:

1)从github上下载zxing-master 项目,项目中主要有3个模块android、android-core、core,其中android-core,core是android模块依赖的library module. android模块的最新版本号为4.7.1,android-core和core的版本号为3.1.1.

2) 我用的ide是android studio,使用gradle进行项目管理。首先在项目中导入android模块,命名为zxing,在build.gradle中加入依赖

dependencies {

compile 'com.google.zxing:android-core:3.1.0'

compile 'com.google.zxing:core:3.1.0'

}

注:

由于gradle中3.1.1版本号编译时说找不到,只好用3.1.0版本。

3)运行zxing模块,可以在真机上快速跑起来,扫描功能也很正常。现在主要的任务就是把代码进行精简,把里面不需要的资源文件及java文件删除,最后确保扫描功能还能正常使用就可以了。基本上保留根目录下的几个文件和camera整个目录的内容就差不多了,什么history,share,wifi之类的统统都用不着。还有res下的大部分内容也需要清理,activity只保留CaptureActivity就够了,把capture.xml中不需要的布局内容也可以删除掉。

4)把zing模块改为library类型,在现有的application的build.gradle中加入依赖关系就可以了,在androidManifest中加入CaptureActivity,然后调用试试。结果发现zxing模块中的部分方法没有定义为public,访问不到,改完这个问题后又发现会有常量错,据说library项目在studio中编译是R资源文件的内容不会加final导致。解决了之后,程序能运行了,但是本来有的扫描框却不见了,诡异啊!无奈,最后只好把zxing模块内容直接拷贝到当前跑的模块中。最后一切运行正常。

5) 由于我的项目是竖屏操作的,而zxing是横屏的,为这个事情折腾了很久,在stackoverflow上搜到的答案大多都是适合老版本的操作,几乎找不到针对最新版4.7.1的。花了大半天的时间最后终于解决了。以下是解决的步骤。

5.1)AndroidManifest中CaptureActivity的screenOrientation属性改为portrait

5.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);

}

5.3)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;

5.4)CameraConfigurationManager的setDesiredCameraParameters方法的camera.setParameters(parameters);之前添加:

camera.setDisplayOrientation(90);

5.5)DecodeHandler的private void decode(byte[] data, int width, int height) 方法中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;

PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);


好了,现在竖屏扫描可以正常使用了,大功告成。

更多相关文章

  1. Android(安卓)Studio 第一次新建Android(安卓)Gradle项目超级慢
  2. Android中经常用到的方法--SDcard下文件的操作
  3. android之Fragment(官网资料翻译)
  4. android中实现多个apk文件
  5. Android(安卓)将被依赖的库项目打包成aar(非jar)文件
  6. Android中解析XML
  7. Android中解析XML
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. android手把手教你开发launcher(五)——设
  2. 教你修改eclipse创建android project时默
  3. 谷歌向全球正式发布 Android(安卓)9,代号
  4. android ListView拖动时会黑屏的解决方法
  5. Android(安卓)Webview使用攻略基础详解
  6. android 与 C# socket之间的收发数据
  7. Android中preference的使用
  8. Android(安卓)通过源码解析 Fragment 启
  9. Android修改圆形进度条ProgressBar的默认
  10. Android(安卓)6.0 权限使用 以及小米手机