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

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
ZBar是一个用于识别和解码条形码二维码的开源软件库。它可以被嵌入到各种应用程序中,例如扫描应用程序,图书馆管理系统等。 在ZBar中,主要有两个函数可以用于扫描二维码: 1. `zbar_image_scanner_create()`:创建一个图像扫描器对象,该对象可以用于扫描包含二维码的图像。 2. `zbar_scan_image()`:使用图像扫描器对象扫描图像,并返回扫描结果。 下面是对这两个函数的详解: 1. `zbar_image_scanner_create()` 该函数用于创建一个图像扫描器对象,该对象可以用于扫描包含二维码的图像。该函数的语法如下: ``` zbar_image_scanner_t *zbar_image_scanner_create(void); ``` 该函数没有任何参数,返回一个指向`zbar_image_scanner_t`类型的指针,该指针指向新创建的图像扫描器对象。 2. `zbar_scan_image()` 该函数用于使用图像扫描器对象扫描图像,并返回扫描结果。该函数的语法如下: ``` int zbar_scan_image(zbar_image_scanner_t *scanner, zbar_image_t *image); ``` 该函数有两个参数: - `scanner`:一个指向`zbar_image_scanner_t`类型的指针,这个指针指向之前创建的图像扫描器对象。 - `image`:一个指向`zbar_image_t`类型的指针,该指针指向包含待扫描的图像的对象。 该函数返回一个整数值,表示扫描结果的类型。如果扫描成功,返回的类型是扫描得到的二维码的类型,例如`ZBAR_QRCODE`表示二维码类型。如果扫描失败,返回值为0。 以上就是ZBar扫描二维码的接口函数的详解。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值