写在最前(这是对上一篇博文的问题做的更新【android利用zbar二维码扫描】)

project下载   zbarLib编译project 
project下载0积分

bug

在2.3的系统中Holder须要设置type,否则会黑屏(感谢网友【(α ⒎待sんа)294439435】)

com.example.qu.MainActivity的第50行mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

今天发现

在com.example.qu.MainActivity中有个静态共享库没有载入进来。在低版本号的ANDROID中会报错

改动方法:

在com.example.qu.MainActivity的第33行新增代码:

static {

System.loadLibrary("iconv");

}

前天早上登陆CSDN时候一条消息:一网友提出了两点疑惑

1.扫描框眼下仅仅是做的假象。是全屏的图片进行解析

2.中文乱码现象

各种查找,今天得以修复:及时共享给各位网友

补张图(有图有真相)

1.扫描框定义

/**
* 2014-7-15 上午11:14:21
* Created By niexiaoqiang
*/ package com.example.qu; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View; /**
* 查找框
* @author niexiaoqiang
*/
public class FinderView extends View {
private static final long ANIMATION_DELAY = 30;
private Paint finderMaskPaint;
private int measureedWidth;
private int measureedHeight; public FinderView(Context context) {
super(context);
init(context);
} public FinderView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(leftRect, finderMaskPaint);
canvas.drawRect(topRect, finderMaskPaint);
canvas.drawRect(rightRect, finderMaskPaint);
canvas.drawRect(bottomRect, finderMaskPaint);
//画框
zx_code_kuang.setBounds(middleRect);
zx_code_kuang.draw(canvas);
if (lineRect.bottom < middleRect.bottom) {
zx_code_line.setBounds(lineRect);
lineRect.top = lineRect.top + lineHeight / 2;
lineRect.bottom = lineRect.bottom + lineHeight / 2;
} else {
lineRect.set(middleRect);
lineRect.bottom = lineRect.top + lineHeight;
zx_code_line.setBounds(lineRect);
}
zx_code_line.draw(canvas);
postInvalidateDelayed(ANIMATION_DELAY, middleRect.left, middleRect.top, middleRect.right, middleRect.bottom);
} private Rect topRect = new Rect();
private Rect bottomRect = new Rect();
private Rect rightRect = new Rect();
private Rect leftRect = new Rect();
private Rect middleRect = new Rect(); private Rect lineRect = new Rect();
private Drawable zx_code_kuang;
private Drawable zx_code_line;
private int lineHeight; private void init(Context context) {
int finder_mask = context.getResources().getColor(R.color.finder_mask);
finderMaskPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
finderMaskPaint.setColor(finder_mask);
zx_code_kuang = context.getResources().getDrawable(R.drawable.zx_code_kuang);
zx_code_line = context.getResources().getDrawable(R.drawable.zx_code_line);
lineHeight = 30;
} //////////////新增该方法//////////////////////
/**
* 依据图片size求出矩形框在图片所在位置,tip:相机旋转90度以后。拍摄的图片是横着的,全部传递參数时,做了交换
* @param w
* @param h
* @return
*/
public Rect getScanImageRect(int w, int h) {
//先求出实际矩形
Rect rect = new Rect();
rect.left = middleRect.left;
rect.right = middleRect.right;
float temp = h / (float) measureedHeight;
rect.top = (int) (middleRect.top * temp);
rect.bottom = (int) (middleRect.bottom * temp);
return rect;
} ////////////////////////////////////
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measureedWidth = MeasureSpec.getSize(widthMeasureSpec);
measureedHeight = MeasureSpec.getSize(heightMeasureSpec);
int borderWidth = measureedWidth / 2 + 100;
middleRect.set((measureedWidth - borderWidth) / 2, (measureedHeight - borderWidth) / 2, (measureedWidth - borderWidth) / 2 + borderWidth, (measureedHeight - borderWidth) / 2 + borderWidth);
lineRect.set(middleRect);
lineRect.bottom = lineRect.top + lineHeight;
leftRect.set(0, middleRect.top, middleRect.left, middleRect.bottom);
topRect.set(0, 0, measureedWidth, middleRect.top);
rightRect.set(middleRect.right, middleRect.top, measureedWidth, middleRect.bottom);
bottomRect.set(0, middleRect.bottom, measureedWidth, measureedHeight);
}
}

2.扫描界面

package com.example.qu;

import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;
import android.app.Activity;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView; public class MainActivity extends Activity implements SurfaceHolder.Callback {
private static String TAG = "xiaoqiang";
private Camera mCamera;
private SurfaceHolder mHolder;
private SurfaceView surface_view;
private ImageScanner scanner;
private Handler autoFocusHandler;
private AsyncDecode asyncDecode; private FinderView finder_view;
private TextView textview; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_zbar_finder);
init();
} private void init() {
surface_view = (SurfaceView) findViewById(R.id.surface_view);
finder_view = (FinderView) findViewById(R.id.finder_view);
textview = (TextView) findViewById(R.id.textview);
mHolder = surface_view.getHolder();
mHolder.addCallback(this);
scanner = new ImageScanner();
scanner.setConfig(0, Config.X_DENSITY, 3);
scanner.setConfig(0, Config.Y_DENSITY, 3);
autoFocusHandler = new Handler();
asyncDecode = new AsyncDecode();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
}
try {
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(mHolder);
mCamera.setPreviewCallback(previewCallback);
mCamera.startPreview();
mCamera.autoFocus(autoFocusCallback);
} catch (Exception e) {
Log.d("DBG", "Error starting camera preview: " + e.getMessage());
}
} /**
* 预览数据
*/
PreviewCallback previewCallback = new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
if (asyncDecode.isStoped()) {
// Camera.Parameters parameters = camera.getParameters();
// Size size = parameters.getPreviewSize();
// Image barcode = new Image(size.width, size.height, "Y800");
// barcode.setData(data);
// asyncDecode = new AsyncDecode();
// asyncDecode.execute(barcode);
Camera.Parameters parameters = camera.getParameters();
Size size = parameters.getPreviewSize();
//图片是被旋转了90度的
Image source = new Image(size.width, size.height, "Y800");
Rect scanImageRect = finder_view.getScanImageRect(size.height, size.width);
//图片旋转了90度,将扫描框的TOP作为left裁剪
source.setCrop(scanImageRect.top, scanImageRect.left, scanImageRect.bottom, scanImageRect.right);
source.setData(data);
asyncDecode = new AsyncDecode();
asyncDecode.execute(source); }
}
}; private class AsyncDecode extends AsyncTask<Image, Void, Void> {
private boolean stoped = true;
private String str = ""; @Override
protected Void doInBackground(Image... params) {
stoped = false;
StringBuilder sb = new StringBuilder();
Image barcode = params[0];
int result = scanner.scanImage(barcode);
if (result != 0) {
// mCamera.setPreviewCallback(null);
// mCamera.stopPreview();
SymbolSet syms = scanner.getResults();
for (Symbol sym : syms) {
switch (sym.getType()) {
case Symbol.CODABAR:
Log.d(TAG, "条形码 " + sym.getData());
//条形码
sb.append(sym.getData() + "\n");
break;
case Symbol.CODE128:
//128编码格式二维码
Log.d(TAG, "128编码格式二维码: " + sym.getData());
sb.append(sym.getData() + "\n");
break;
case Symbol.QRCODE:
//QR码二维码
Log.d(TAG, "QR码二维码 :" + sym.getData());
sb.append(sym.getData() + "\n");
break;
case Symbol.ISBN10:
//ISBN10图书查询
Log.d(TAG, "ISBN10图书查询 : " + sym.getData());
sb.append(sym.getData() + "\n");
break;
case Symbol.ISBN13:
//ISBN13图书查询
Log.d(TAG, "ISBN13图书查询 : " + sym.getData());
sb.append(sym.getData() + "\n");
break;
case Symbol.NONE:
Log.d(TAG, "未知 : " + sym.getData());
sb.append(sym.getData() + "\n");
break;
default:
Log.d(TAG, "其它: " + sym.getData());
sb.append(sym.getData() + "\n");
break;
}
}
}
str = sb.toString();
return null;
} @Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
stoped = true;
if (null == str || str.equals("")) {
} else {
textview.setText(str);
}
} public boolean isStoped() {
return stoped;
}
} /**
* 自己主动对焦回调
*/
AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
autoFocusHandler.postDelayed(doAutoFocus, 1000);
}
}; //自己主动对焦
private Runnable doAutoFocus = new Runnable() {
public void run() {
if (null == mCamera || null == autoFocusCallback) {
return;
}
mCamera.autoFocus(autoFocusCallback);
}
}; @Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
} catch (Exception e) {
mCamera = null;
}
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
}<pre name="code" class="html">

3.布局定义

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" > <SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <com.example.qu.FinderView
android:id="@+id/finder_view"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="center_vertical"
android:textColor="@color/rea" /> </FrameLayout>

一些资源文件请下载源代码,假设没有积分可QQ联系312122330

//关于乱码的解决    zbarLib编译project

1.我又一次使用NDK编译了zbar的库。并对zbarlib\jni\zbar\qrcode\qrdectxt.c做了例如以下改动

/*This is the encoding the standard says is the default.*/

/*********************************************/

/*********   改动此处以支持中文                                      **********/

/*********************************************/

//latin1_cd=iconv_open("UTF-8","ISO8859-1");

latin1_cd = iconv_open("UTF-8", "GB18030");





/*But this one is often used, as well.*/

//sjis_cd = iconv_open("UTF-8", "SJIS");

sjis_cd = iconv_open("UTF-8", "GB2312");

/*********************************************/

2.NDK编译这块儿有麻烦的朋友。预计就要好好学习下了。

东西太多,不好些博文

android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)的更多相关文章

  1. Android快速实现二维码扫描--Zbar

    Android中二维码扫描的最常用库是zxing和zbar,上一篇<Android快速实现二维码扫描–Zxing>介绍了Zxing.这次说Zbar,Zbar速度极快,我就比较常用,项目地址 ...

  2. Android二维码的生成,解析以及扫描功能

    <1> 布局只有2个按钮,实现生成二维码和解析二维码 <Button android:layout_width="wrap_content" android:la ...

  3. Android开发——Android中的二维码生成与扫描

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...

  4. Opencv+Zbar二维码识别(二维码校正)

    二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...

  5. Android开发 QRCode二维码开发第三方框架

    前言 Android开发里二维码开发经常用到,这里简单的介绍下Android开发里的二维码. 最广泛使用的二维码库zxing zxing是最广泛的二维码库各个平台都可以适用它,但是Android平台使 ...

  6. Android Wear和二维码

    这是一篇发布在Android官方开发者社区博客,15年年初的时候就看到了这篇文章,直到现在才有时间把它翻译下来. 这是一篇如何在Android Wear上面如何正确地展示二维码的文章,里面有许多的经验 ...

  7. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

    tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...

  8. jquery.qrcode.js 生成二维码并支持中文的方法

    GitHub地址: https://github.com/jeromeetienne/jquery-qrcode <div class="QR"></div> ...

  9. Android快速实现二维码扫描--Zxing

    Android中二维码扫描的最常用库是zxing和zbar,zxing项目地址为https://github.com/zxing/zxing,目前还有多个人在维护.zbar主要用C来写的,对速度有要求 ...

随机推荐

  1. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

  2. BZOJ3280: 小R的烦恼

    题解: 随便建一下图费用流就可以过吧... 代码: #include<cstdio> #include<cstdlib> #include<cmath> #incl ...

  3. DOM事件逐层上机传递

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 在Oracle中更新数据时,抛出:ORA-01008: not all variables bound

    在Oracle中更新数据时,抛出了一个 :ORA-01008 not all variables bound, 我的理解是不是所有的变量/参数都有边界,不懂: 后来知道了,原来是“不是所有变量/参数都 ...

  5. Query Profiler 和Explain 用法详解

    一.Query Profiler  MySQL 的Query Profiler 是一个使用非常方便的Query 诊断分析工具,通过该工具可以获取一条Query 在整个执行过程中多种资源的消耗情况,如C ...

  6. HDU 3567 Eight II BFS预处理

    题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...

  7. 用JDK自带的工具生成客户端调用Webservice的代码

    JAVA下客户端调用Webservice代码简直是让人心生畏惧,今日尝试,做记录如下,参考网上的众多解决方案,下面这种方式是比较简单的. 在jdk的bin目录下有一个wsimport.exe的工具,使 ...

  8. Install minidwep-gtk

    Hi to everyone in this time i'm going to show you how to install minidwep-gtk to test your own wifi ...

  9. 在linux上通过JDBC连接ORACLE 时总是出现 java.sql.SQLRecoverableException: IO Error: Connection reset 的问题

    如标题所述,经过和度娘沟通了不知道多少遍最后看一篇文章解决, 我是通过执行jar来操作DB的.所以在命令中加了一个参数( 加粗,红色) eg: $JAVA_EXE -Djava.security.eg ...

  10. C#中克隆随机数的三种方法(为什么我想到了茴字的四种写法

    C#中的Random类可以用来产生伪随机数(正确的废话 伪随机数的一个性质就是给定一个初始种子,那么产生的随机数列都是相同的,这个性质非常适合用在不同环境之间同步逻辑的场景. 最近有一个要克隆当前随机 ...