项目中需要用到条码扫描功能,花了小半天时间才把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之Activity
  2. 关于Zipalign的介绍和使用方法
  3. android后台服务service全解析(上)--service的使用与本地通信
  4. Android(安卓)studio删除工程项目
  5. Android(安卓)Studio 创建第一个项目应用
  6. Windows 下的Android(安卓)NDK开发
  7. Android快速调试方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. ANDROID缩略图Thumbnails
  2. 深度剖析 | 阿里热修复如何精简优化补丁
  3. 摄像头的使用之(Camera的使用)
  4. Android中AsyncTask的简单总结
  5. Android实现滑动的七种方法实践
  6. 分享Android(安卓)recovery updater-scri
  7. 如何测试并调试基于 NDK 的 Android(安卓
  8. 关于Android(安卓)WebView不支持location
  9. 手把手教你用android studio创建第一个安
  10. Android(安卓)WebView拦截iframe标签内部