项目中需要用到条码扫描功能,花了小半天时间才把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 创建第一个项目应用
  2. android平台下基于ffmpeg的swscale模块实现对YUV和RGB数据进行转
  3. 关于Zipalign的介绍和使用方法
  4. 最全的Android项目结构以及功能
  5. Android测试方法总结
  6. Android下生成core dump的方法

随机推荐

  1. Android(安卓)极光推送快速开发集成指南
  2. Android中GridView的使用——使用自带的S
  3. Android应用平均价格是iOS应用的2.5倍
  4. 安卓Android的系统架构详细解析
  5. Android操作JNI函数以及复杂对象传递
  6. 【转】制作不暴露源码的Android(安卓)Lib
  7. android实现简单的聊天室
  8. Android(安卓)带清除功能的输入框控件Cle
  9. Android(安卓)TextView大全
  10. 移动段开发前景真的凉了么?