Android使用ZBar扫描二维码/条形码(实例)+常见问题汇总
写在前面:因项目需求,需要实现二维码扫码功能,笔者测试过多种开源扫码工具,但因不跨平台、扫描速度慢等问题逐个放弃,最后选用ZBar实现功能,笔者发现ZBar扫码在跨主流手机平台、扫码速度等方面有较明显的优势,现将核心功能整理成示例代码,便于日后复用和有需要的读者参考。
========================2017.06.19 重要更新==========================
有读者反馈代码在Android 6.0和7.0上运行会闪退,经查,是权限问题,Android6.0+具有更高要求的权限限制,对敏感性操作(如调用摄像头、访问通讯录等)需要额外申请运行时权限(当然AndroidManifest.xml也要注册)。详细资料可以参考这里。问题现已解决,源码如下,亲测,兼容Android 5.0/6.0/7.0。
示例源码:(推荐下载,完美兼容Android 5.0/6.0/7.0,代码简单易移植,0积分共享)
http://download.csdn.net/detail/daijin888888/9874527
GitHub(给个星杯~):https://github.com/VingeDai/ZBarScanDemo
主要新增的代码段:
1、添加权限判断
// 判断是否有相机权限(主要用于兼容Android 6.0+)if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {// 有相机权限initViews();} else {ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.CAMERA },CAMERA_REQUEST_CODE);// 无权限,申请相机权限,然后利用回调函数判断是否申请成功}
2、利用申请权限的回调结果进一步操作
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions, @NonNull int[] grantResults) {// 申请权限后的回调操作// 判断请求码if (requestCode == CAMERA_REQUEST_CODE) {// grantResults授权结果if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {initViews();} else {// 授权失败showTip();}}}
**注意**:
第一,以上代码段需实现OnRequestPermissionsResultCallback接口,该接口只存在于较新版本的android-support-v4.jar中,如果读者的android-support-v4.jar中不包含该接口,可以替换以下供下载的源码中的jar包。
第二,以上代码段需在具有可发送请求的组件中编码(比如Activity、Fragment等上下文环境中),否则onRequestPermissionsResult无法正常回调,即便在其它组件(如Adapter)中传入Activity等的引用实例,也同样如此。这点很重要!
有疑问欢迎留言!
========================2016.08.31更新==========================
原文的示例适用于Android 4.X系统,但在Android 5.0上不兼容,出现“打开摄像头后立即自动关闭”的问题,报错:
AndroidRuntime(2797): java.lang.UnsatisfiedLinkError: dlopen failed: "/data/appxxx.xxx.xxxx-1/lib/arm64/libiconv.so" is 32-bit instead of 64-bit
原因是,Android 5.0+(包括6.0)默认开启ART模式并支持64位,如果libs下带“64”的文件夹(5.0以上系统会自动在此文件夹下加载.so文件)里的是32位而不是64位的.so文件,就会报上述错误。
笔者在网上找到跨平台的ZBar Demo,现将资源共享,本文原始资源(以下“资源下载”中提供的)不再建议使用。
Android使用ZBar扫描二维码/条形码(实例)【兼容Android5.0平台】
(推荐使用,已不推荐使用,不兼容Android 6.0+)下载地址:http://download.csdn.net/detail/daijin888888/9617663
资源下载(已不建议使用,因为不兼容Android 5.0+系统)
1.开发所需库文件:http://download.csdn.net/detail/daijin888888/9516705
2.完整实例源码(包含以上库文件):http://download.csdn.net/detail/daijin888888/9516713
使用方式
1.复制com.zbar.lib及其下共4个包文件到项目中。
2.在lib下添加armeabi中的libiconv.so和libzbar.so库文件。
3.添加res下的资源文件,包括drawable、layout、raw、values(包含ids.xml)等。
4.在AndroidManifest.xml清单中添加权限和Activity声明。
5.调用扫码功能,在调用处通过以下代码使用扫码功能:
Intent intent = new Intent();
intent.setClass(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
6.获得扫码结果,在步骤5中代码块所在的Activity中通过以下代码获取扫码结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case SCANNIN_GREQUEST_CODE:if (resultCode == RESULT_OK) {String result = data.getStringExtra("QR_CODE");// TODO 获取结果,做逻辑操作tvResult.setText(result);} else {Toast.makeText(this, "无法获取扫码结果", 2000).show();}break;}
}
测试效果:
1.二维码(一串字符:1234567890)
2.扫码前(点击“扫码”开始扫码)
3.扫码时(对准二维码)
4.扫码后(呈现出扫码结果)
常见问题汇总
移植后,若项目本身没报错,但不能扫码,可能存在以下问题:
1.未移植armeabi文件夹下的libiconv.so和libzbar.so库文件。(缺少时一般在运行时报错)
2.未在AndroidManifest.xml清单中配置所需权限。(可以运行,但扫码时黑屏,无法开启摄像头)
<!-- 二维码扫码 -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
3.未在AndroidManifest.xml清单文件中配置Activity:CaptureActivity。(缺少时一般在运行时报错)
<activity
android:name="com.zbar.lib.CaptureActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" >
4.报错:
AndroidRuntime(2797): java.lang.UnsatisfiedLinkError: dlopen failed: "/data/appxxx.xxx.xxxx-1/lib/arm64/libiconv.so" is 32-bit instead of 64-bit
解决方案见上述2016.08.31更新说明。
5.报错闪退:
java.lang.RuntimeException:getParameters failed (empty parameters)
解决方案见上述2017.06.19更新内容。
转载请注明出处:
http://blog.csdn.net/daijin888888/article/details/51374263
Android使用ZBar扫描二维码/条形码(实例)+常见问题汇总相关推荐
- Android PAD扫描枪扫描二维码条形码
Android PAD扫描枪扫描二维码条形码 1,目前扫描条码只有通过按键触发,按下按键会发送F12的键值,可以通过监听F12键判断是否触发扫描 2,扫到的条码我们会在当前光标处显示出来,同时也发了一 ...
- Android之条码扫描二维码扫描
Android之条码扫描二维码扫描 二维码条形码扫描,参考技术网址: 1.Apache License 2.0 开源的 ZXing项目的简化版 http://xinlanzero.iteye.com/ ...
- Android之ZXing扫描二维码以及生成二维码
Android之ZXing扫描二维码以及生成二维码 ZXIng项目地址:ZXing地址 项目结构 扫描二维码:使用 CaptureActivity类 项目代码: import android.cont ...
- iOS 扫描二维码/条形码
级别:★★☆☆☆ 标签:「iOS 原生扫描」「AVCaptureSession」「AVCaptureDevice」「rectOfInterest」 作者: Xs·H 审校: QiShare团队 最近做 ...
- ZBar扫描二维码乱码
在ios7版本上使用zbar进行二维码扫描的时候,出现了在扫描某些汉字的时候有乱码的情况,并且不是全部有乱码. 通过排查可以看到zbar本身支持的语言编码是日语的, 网上搜索得知可以修改默认的编码然后 ...
- 微信小程序扫描二维码条形码 (wx.scanCode)
前言 在业务中遇到需要获取商品的二维码的信息返回商品的二维码信息,在调用后台的接口,首先想到用小程序的Api,wx.scanCode(Object object)获取二维码信息. 支持相机扫描或者相册 ...
- 微信小程序扫描二维码条形码
wxml代码 <button class='deaBtn' bindtap='scancode'>扫描二维码</button> js代码 scancode: function( ...
- python扫描二维码输出内容_通过python扫描二维码/条形码并打印数据
需提前安装好pyzbar和opencv-python库(博主的电脑安装opencv-python库比较麻烦,但大部分都不会出现该问题) 安装方法:打开命令框输入 pip install pyzbar/ ...
- [Unity+Android]横版扫描二维码
更多教程请访问: http://dingxiaowei.cn/ 终于解决了一个忧伤好久的问题,严重拖了项目进度,深感惭愧!一直被一系列的问题所困扰,然后又只能自己一个人摸索,也是一段辛酸忧伤史,现在小 ...
最新文章
- 《聚爆Implosion》性能精析:这是我们测过性能最棒的手游
- ffplay的快捷键以及选项
- Java面试——MyBatis系列总结
- sql 缓冲池_运行中SQL Server缓冲池
- 2021-1-31linux学习纪要
- java数据流更新文件内容,数据流 · Java 文件操作 · 看云
- node socketlog
- 试验笔记 - 使用7-ZIP压缩来减小APK安装包体积
- 计算机潮流算法一般采用,计算机潮流计算
- 我喜欢用计算机300,我喜欢的人_作文300字_小学四年级作文_第一范文网
- cad用键盘放大缩小_CAD的放大缩小快捷键是什么?
- .net 2.0安装包打不开_Android——bilibili缓存视频合并教程[2.0]
- 边缘提取——Prewitt算子和Sobel算子
- jstree的属性设置
- 为什么单页面的seo不友好?如何解决这一问题?
- PHP制作音乐播放器制作教案,js制作简单的音乐播放器的示例代码
- 酒瓶换酒编程C语言,【终极答案】一劳永逸解决天空问题:酒瓶换酒问题
- 关于谷歌浏览器很慢的原因
- UnityShader 曲面细分着色器 生成地形 高度贴图
- sql优化之:改善SQL语句