# android-zbar-sdk
**Repository Path**: mirrors_yanzhenjie/android-zbar-sdk
## Basic Information
- **Project Name**: android-zbar-sdk
- **Description**: :link: android-zbar-sdk, provide jni source, so file and jar file used alone, gradle/maven remote dependencies.
- **Primary Language**: Unknown
- **License**: LGPL-2.1
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-08-19
- **Last Updated**: 2025-06-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
`Zbar`和`libiconv`都是基于`LGPL-2.1`协议开源的,基于`LGPL-2.1`协议,我为`Android`平台整理了`Zbar`和`libiconv`,方便`Android`开发者使用`Zbar`。
大多数的`Android`开发者不熟悉JNI,并且在编译原生`Zbar`时需要先编译`libiconv`,而且会遇到很多错误和难点,大多数人在网上七拼八凑的找到了别人编译好的 **so** 文件,但是很多人都遇到了错误导致没法修改,现在我把`Zbar`和`libiconv`的源码整理好了,并且修复了在编译时的错误和**中文识别时乱码**的问题。
已经我编译后封装过的`Zbar`:
1. **可以直接ndk-build编译的JNI源码**
2. **可以单独使用的Jar包和so文件**
3. **可以远程依赖的原生Zbar**
4. **封装了Zbar可以直接扫描的相机**
我用的`libiconv`是在2017-02-02发布的1.15版本。
Zbar开源地址: [https://github.com/ZBar/ZBar](https://github.com/ZBar/ZBar)
libiconv下载: [https://www.gnu.org/software/libiconv](https://www.gnu.org/software/libiconv)
我的主页:[www.yanzhenjie.com](http://www.yanzhenjie.com)
我的博客:[blog.yanzhenjie.com](http://blog.yanzhenjie.com)
技术交流群:[547839514](https://jq.qq.com/?_wv=1027&k=48Yg8H1)
# 使用
## 仅仅使用核心Zbar
如果你仅仅想使用原生的Zbar,可以结合相机使用,也可以单独直接识别二维码。
首先需要添加依赖,支持以下三种方式:
* so文件和jar文件
下载源码后`android-zbar-sdk/jar`文件夹的`zbar-1.0.0.jar`就是`Zbar`核心`jar`包,`android-zbar-sdk\zbar\src\main\jniLibs`下是各个平台的`so`文件,选择自己需要的即可。
* Gradle
```groovy
compile 'com.yanzhenjie.zbar:zbar:1.0.0'
```
* Maven
```groovy
com.yanzhenjie.zbar
zbar
1.0.0
pom
```
**注意**:使用远程依赖方式会加载所有平台的so文件,如果你只想依赖其中某几个平台(例如某第三方地图只提供了`armeabi`和`armeabi-v7a`的so,当app运行在x86的手机上时,就会出现加载x86平台某地图so文件失败造成app崩溃的情况),那么你需要添加编译配置:
```
defaultConfig {
applicationId ...
...
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64', 'x86', 'x86_64'
}
}
```
在`ndk{}`的`{}`中写上你需要的平台即可只加载你需要的平台的so文件,比如你只需要`armeabi`和`armeabi-v7a`:
```
ndk {
abiFilters 'armeabi', 'armeabi-v7a'
}
```
Zbar核心识别条码/二维码的代码如下:
```java
byte[] imageData = ...;
Image barcode = new Image(size.width, size.height, "Y800");
barcode.setData(imageData);
// 设置截取区域,也就是你的扫描框在图片上的区域.
// barcode.setCrop(startX, startY, width, height);
String qrCodeString = null;
int result = mImageScanner.scanImage(barcode);
if (result != 0) {
SymbolSet symSet = mImageScanner.getResults();
for (Symbol sym : symSet)
qrCodeString = sym.getData();
}
if (!TextUtils.isEmpty(qrCodeString)) {
// 非空表示识别出结果了。
}
```
不仅如此,你也可以结合相机和上述代码做扫码识别条码/二维码。在sample中有结合相机扫码的例子。
## 使用相机和Zbar的封装
如果你对相机的使用不太熟悉,那么你可以使用我封装的相机和Zbar的结合,这将非常方便的完成扫码:
添加依赖:
* Gradle
```groovy
compile 'com.yanzhenjie.zbar:camera:1.0.0'
```
* Maven
```groovy
com.yanzhenjie.zbar
camera
1.0.0
pom
```
这是一个在Activity中的简单的例子:
`activity_scan.xml`
```xml
```
`ScanActivity.java`
```java
private CameraPreview mPreview;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
mPreview = (CameraPreview) findViewById(R.id.capture_preview);
mPreview.setScanCallback(callback);
}
/**
* 打开相机并开始扫描。
*/
private void startScan() {
mPreview.start();
}
/**
* 停止扫描并关闭相机。
*/
private void stopScan() {
mPreview.stop();
}
/**
* 监听结果。
*/
private ScanCallback callback = new ScanCallback() {
@Override
public void onScanResult(String content) {
// Successfully.
}
};
@Override
protected void onPause() {
// 必须在这里停止扫描释放相机。
stopScan();
super.onPause();
}
```
在正式开发中,你还需要注意`运行时权限`和相机是否被占用等异常情况。
对于权限管理,我推荐你使用AndPermission:[https://github.com/yanzhenjie/AndPermission](https://github.com/yanzhenjie/AndPermission)
比如相机是否正常打开/是否被其它应用占用:
```java
/**
* Start camera.
*/
private void startScan() {
if(mPreview.start()) {
// 相机被成功打开并开始扫描,你可以展示一个扫描的动画了。
} else {
// 相机被占用或者打开失败。
}
}
```
更多的例子请参考sample。
# 混淆规则
如果你已经有以下两个规则,那么就不用添加了。
```text
-keepclassmembers class * {
native ;
}
-keepclasseswithmembernames class * {
native ;
}
```
**关注我的微信公众号**
或者微信公众号搜索**严振杰**
