android怎么android zxing 二维码码扫描

网站已改版,请使用新地址访问:
ZXingDemo 基于Android的二维码扫描 ,识别非常快 率很高
238万源代码下载-
&文件名称: ZXingDemo
& & & & &&]
&&所属分类:
&&开发工具: Java
&&文件大小: 2213 KB
&&上传时间:
&&下载次数: 9
&&提 供 者:
&详细说明:基于Android的二维码扫描Demo,识别非常快,识别率很高-Android-based two-dimensional code scanning Demo, recognition is very fast, very high recognition rate
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&ZXingDemo&&.........\.classpath&&.........\.project&&.........\.settings&&.........\.........\.svn&&.........\.........\....\all-wcprops&&.........\.........\....\entries&&.........\.........\....\format&&.........\.........\....\prop-base&&.........\.........\....\props&&.........\.........\....\text-base&&.........\.........\....\.........\org.eclipse.jdt.core.prefs.svn-base&&.........\.........\....\tmp&&.........\.........\....\...\prop-base&&.........\.........\....\...\props&&.........\.........\....\...\text-base&&.........\.........\org.eclipse.jdt.core.prefs&&.........\.svn&&.........\....\all-wcprops&&.........\....\entries&&.........\....\format&&.........\....\prop-base&&.........\....\props&&.........\....\text-base&&.........\....\.........\.classpath.svn-base&&.........\....\.........\.project.svn-base&&.........\....\.........\AndroidManifest.xml.svn-base&&.........\....\.........\proguard.cfg.svn-base&&.........\....\.........\project.properties.svn-base&&.........\....\tmp&&.........\....\...\prop-base&&.........\....\...\props&&.........\....\...\text-base&&.........\AndroidManifest.xml&&.........\assets&&.........\......\.svn&&.........\......\....\all-wcprops&&.........\......\....\entries&&.........\......\....\format&&.........\......\....\prop-base&&.........\......\....\props&&.........\......\....\text-base&&.........\......\....\tmp&&.........\......\....\...\prop-base&&.........\......\....\...\props&&.........\......\....\...\text-base&&.........\bin&&.........\...\.svn&&.........\...\....\all-wcprops&&.........\...\....\entries&&.........\...\....\format&&.........\...\....\prop-base&&.........\...\....\.........\ZXingDemo.apk.svn-base&&.........\...\....\.........\classes.dex.svn-base&&.........\...\....\.........\resources.ap_.svn-base&&.........\...\....\props&&.........\...\....\text-base&&.........\...\....\.........\AndroidManifest.xml.svn-base&&.........\...\....\.........\ZXingDemo.apk.svn-base&&.........\...\....\.........\classes.dex.svn-base&&.........\...\....\.........\jarlist.cache.svn-base&&.........\...\....\.........\resources.ap_.svn-base&&.........\...\....\tmp&&.........\...\....\...\prop-base&&.........\...\....\...\props&&.........\...\....\...\text-base&&.........\...\AndroidManifest.xml&&.........\...\ZXingDemo.apk&&.........\...\classes&&.........\...\.......\com&&.........\...\.......\...\zijunlin&&.........\...\.......\...\........\Zxing&&.........\...\.......\...\........\.....\Demo&&.........\...\.......\...\........\.....\....\BuildConfig.class&&.........\...\.......\...\........\.....\....\CaptureActivity$1.class&&.........\...\.......\...\........\.....\....\CaptureActivity.class&&.........\...\.......\...\........\.....\....\CreateQRImageTest.class&&.........\...\.......\...\........\.....\....\R$attr.class&&.........\...\.......\...\........\.....\....\R$color.class&&.........\...\.......\...\........\.....\....\R$drawable.class&&.........\...\.......\...\........\.....\....\R$id.class&&.........\...\.......\...\........\.....\....\R$layout.class&&.........\...\.......\...\........\.....\....\R$raw.class&&.........\...\.......\...\........\.....\....\R$string.class&&.........\...\.......\...\........\.....\....\R.class&&.........\...\.......\...\........\.....\....\camera&&.........\...\.......\...\........\.....\....\......\AutoFocusCallback.class&&.........\...\.......\...\........\.....\....\......\CameraConfigurationManager.class&&.........\...\.......\...\........\.....\....\......\CameraManager.class&&.........\...\.......\...\........\.....\....\......\FlashlightManager.class&&.........\...\.......\...\........\.....\....\......\PlanarYUVLuminanceSource.class&&.........\...\.......\...\........\.....\....\......\PreviewCallback.class&&.........\...\.......\...\........\.....\....\decoding&&.........\...\.......\...\........\.....\....\........\CaptureActivityHandler$State.class&&.........\...\.......\...\........\.....\....\........\CaptureActivityHandler.class&&.........\...\.......\...\........\.....\....\........\DecodeFormatManager.class&&.........\...\.......\...\........\.....\....\........\DecodeHandler.class&&.........\...\.......\...\........\.....\....\........\DecodeThread.class&&.........\...\.......\...\........\.....\....\........\FinishListener.class&&.........\...\.......\...\........\.....\....\........\InactivityTimer$DaemonThreadFactory.class
&近期下载过的用户:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 数字电子技术 基本电子参数与原件概要,以及逻辑运算法则,
&[] - 基于Android的九宫格解锁Demo,具有设置密码、重置密码和验证密码的功能
&[] - 一个漂亮的android APP 的界面,可以直接运行,修改非常方便。 请不要用作商业用途
&[] - 基于Android,利用tesseract实现英文扫描识别,可通过替换语言库等实现各种语言的识别
&[] - 包含有各种Android编程的实例代码实现,包括3D游戏开发,手机通信功能开发,手机特有Feature开发以及传感器的应用及开发等等。
&[] - Android TXT文本阅读器源码,用eclipse导入就可以使用。
&[] - Android-使用Java语言编写的调用系统相机的程序,并将所拍的照片保存在sdcard的指定位置。
&[] - android 层叠图片 viewpager+相对布局实现层叠效果Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码
一、二维码与条形码工作原理
目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有,还有分享名片功能(也是一张二维码图片,识别扫描)。
下面小编将通过文章主要介绍QRCode方面技术.
QRCode是被广泛应用的一种二维码,解码速度快。二维码相对于条形码来说,二维码的存储数据量更大,空间利用率高,有一定的容错性。
二维码原理介绍:
二维码是用某种特定的几何图形按一定的规律在平面上分布的黑白相间的图形记录数据符号信息的;
在代码编制上巧妙的利用构成计算机内部逻辑基础的0/1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理;
二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息;
二维码相对于条形码的优势就是省空间;
QRCode基本结构
上图是一个QRCode的基本结构:
位置探测图形、位置探测图形分隔符、定位图形:用于二维码的定位,对每个QR来说,位置都是固定存在的,只是大小规格有所差异;
校正图形:确定规格,校正图形的数量和位置也就确定了;
格式信息:表示二维码的纠错级别,分为L、M、Q、H;
版本信息:即二维码的规格,QR码符号共有40种规格的矩阵;
数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。
条形码原理介绍:
条形码扫描器结构
由于不同颜色的物体,其反射的可见光的波长不同,所以当条形码扫描器光源发出的光经光阑及凸透镜1后,照射到黑白相间的条形码上时,反射光经凸透镜2聚焦后,照射到光电转换器上,于是光电转换器接受到与白条和黑条相对应的强弱不同的反射光信号,并转换成相应的电信号输出到放大整形电路,整形电路把模拟信号转换成数字电信号,再经译码接口电路译成数字字符信息。
整形电路的脉冲数字信号经译码器译成数字、字符信息.它通过识别起始、终止字符来判别出条形码符号的码制及扫描方向;通过测量脉冲数字电信号0、1的数目来判别出条和空的数目.通过测量0、1信号持续的时间来判别条和空的宽度.这样便得到了被辩读的条形码符号的条和空的数目及相应的宽度和所用码制,根据码制所对应的编码规则,便可将条形符号换成相应的数字、字符信息,通过接口电路送给计算机进行数据处理与管理,便完成了条形码辨读的全过程。
二、Zxing使用原理介绍
Zxing是一个开源的,用于实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口。
Zxing可以实现使用手机的内置摄像头完成条形码和二维码的扫描与解码。
Zxing可以实现条形码和二维码的编码与解码。
Zxing目前支持的格式如下:UPC-A、UPC-E、EAN-8、EAN-13、39码、93码、代码128、QR码。
三、实现步骤
1.导入Zxing.jar包,直接将内的com.mining.app.zxing.camera,com.mining.app.zxing.decoding, com.mining.app.zxing.view, com.mining.app.zxing.encoding四个文件夹,zxing package直接复制到你的工程目录下。
源码下载地址:
GitHub下载地址:
2.将raw文件(用于),values,权限以及资源文件,全部准备完全,详情可参见源码。
3. activity.xml主菜单布局文件
4.activity_capture.xml扫描布局文件
&framelayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="/apk/res/android"&
&/framelayout&
5.activity_title.xml Title布局文件
上述文件用于标签,便于修改以及占少量内存
6.MainActivity.java.主界面用于事件的处理
import android.app.A
import android.content.I
import android.graphics.B
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.ImageV
import android.widget.TextV
import android.widget.T
import com.google.zxing.WriterE
import zxing.encoding.EncodingH
public class MainActivity extends Activity {
private final static int SCANNIN_GREQUEST_CODE = 1;
* 显示扫描结果
private TextView mTextV
* 显示扫描拍的图片
private ImageView mImageV
* 输入框产生二维码
* @param savedInstanceState
private EditText qrStrEditT
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.result);
mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);
qrStrEditText = (EditText) findViewById(R.id.et_qr_string);
//点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转
//扫描完了之后调到该界面
Button mButtonScan = (Button) findViewById(R.id.button1);
Button mBtnTwoCode = (Button) findViewById(R.id.button2);
Button mBtnOneCode = (Button) findViewById(R.id.button3);
mButtonScan.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MipcaActivityCapture.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
//产生二维码
mBtnTwoCode.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String contentString = qrStrEditText.getText().toString();
if (!contentString.equals(&&)) {
Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350);
mImageView.setImageBitmap(qrCodeBitmap);
qrStrEditText.setText(&&);
mTextView.setText(contentString);
Toast.makeText(getApplicationContext(), &Text can be not empty&, Toast.LENGTH_SHORT).show();
} catch (WriterException e) {
e.printStackTrace();
//产生条形码
mBtnOneCode.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String contentString = qrStrEditText.getText().toString();
int size = contentString.length();
for (int i = 0; i & i++) {
int c = contentString.charAt(i);
if ((19968 &= c && c & 40623)) {
Toast.makeText(getApplicationContext(), &text not be chinese&, Toast.LENGTH_SHORT).show();
Bitmap mBmpOneCode =
if (contentString != null && !&&.equals(contentString)) {
mBmpOneCode = EncodingHandler.CreateOneDCode(contentString);
qrStrEditText.setText(&&);
mTextView.setText(contentString);
} catch (WriterException e) {
e.printStackTrace();
if (mBmpOneCode != null) {
mImageView.setImageBitmap(mBmpOneCode);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SCANNIN_GREQUEST_CODE:
if(resultCode == RESULT_OK){
Bundle bundle = data.getExtras();
//显示扫描到的内容
mTextView.setText(bundle.getString(&result&));
mImageView.setImageBitmap((Bitmap) data.getParcelableExtra(&bitmap&));
7.MipcaActivityCapture.java.主要是调用起Camera功能进行扫描
import android.app.A
import android.content.I
import android.content.res.AssetFileD
import android.graphics.B
import android.media.AudioM
import android.media.MediaP
import android.media.MediaPlayer.OnCompletionL
import android.os.B
import android.os.H
import android.os.V
import android.view.SurfaceH
import android.view.SurfaceHolder.C
import android.view.SurfaceV
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.T
import com.google.zxing.BarcodeF
import com.google.zxing.R
import java.io.IOE
import java.util.V
import zxing.camera.CameraM
import zxing.decoding.CaptureActivityH
import zxing.decoding.InactivityT
import zxing.view.ViewfinderV
* Initial the camera
* @author Ryan.Tang
public class MipcaActivityCapture extends Activity implements Callback {
private CaptureActivityH
private ViewfinderView viewfinderV
private boolean hasS
private Vector decodeF
private String characterS
private InactivityTimer inactivityT
private MediaPlayer mediaP
private boolean playB
private static final float BEEP_VOLUME = 0.10f;
* Called when the activity is first created.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capture);
//ViewUtil.addTopView(getApplicationContext(), this, R.string.scan_card);
CameraManager.init(getApplication());
viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
Button mButtonBack = (Button) findViewById(R.id.button_back);
mButtonBack.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MipcaActivityCapture.this.finish();
hasSurface =
inactivityTimer = new InactivityTimer(this);
protected void onResume() {
super.onResume();
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
if (hasSurface) {
initCamera(surfaceHolder);
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
decodeFormats =
characterSet =
playBeep =
AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
playBeep =
initBeepSound();
protected void onPause() {
super.onPause();
if (handler != null) {
handler.quitSynchronously();
CameraManager.get().closeDriver();
protected void onDestroy() {
inactivityTimer.shutdown();
super.onDestroy();
* 处理扫描结果
* @param result
* @param barcode
public void handleDecode(Result result, Bitmap barcode) {
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
String resultString = result.getText();
if (resultString.equals(&&)) {
Toast.makeText(MipcaActivityCapture.this, &Scan failed!&, Toast.LENGTH_SHORT).show();
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(&result&, resultString);
bundle.putParcelable(&bitmap&, barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK, resultIntent);
MipcaActivityCapture.this.finish();
private void initCamera(SurfaceHolder surfaceHolder) {
CameraManager.get().openDriver(surfaceHolder);
} catch (IOException ioe) {
} catch (RuntimeException e) {
if (handler == null) {
handler = new CaptureActivityHandler(this, decodeFormats,
characterSet);
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
public void surfaceCreated(SurfaceHolder holder) {
if (!hasSurface) {
hasSurface =
initCamera(holder);
public void surfaceDestroyed(SurfaceHolder holder) {
hasSurface =
public ViewfinderView getViewfinderView() {
return viewfinderV
public Handler getHandler() {
public void drawViewfinder() {
viewfinderView.drawViewfinder();
private void initBeepSound() {
if (playBeep && mediaPlayer == null) {
// The volume on STREAM_SYSTEM is not adjustable, and users found it
// too loud,
// so we now play on the music stream.
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnCompletionListener(beepListener);
AssetFileDescriptor file = getResources().openRawResourceFd(
R.raw.beep);
mediaPlayer.setDataSource(file.getFileDescriptor(),
file.getStartOffset(), file.getLength());
file.close();
mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
mediaPlayer.prepare();
} catch (IOException e) {
mediaPlayer =
private static final long VIBRATE_DURATION = 200L;
private void playBeepSoundAndVibrate() {
if (playBeep && mediaPlayer != null) {
mediaPlayer.start();
if (vibrate) {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(VIBRATE_DURATION);
* When the beep has finished playing, rewind to queue up another one.
private final OnCompletionListener beepListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.seekTo(0);
四、代码分析
1.生成二维码
调用方法:
//产生二维码
mBtnTwoCode.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String contentString = qrStrEditText.getText().toString();
if (!contentString.equals(&&)) {
Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350);
mImageView.setImageBitmap(qrCodeBitmap);
qrStrEditText.setText(&&);
mTextView.setText(contentString);
Toast.makeText(getApplicationContext(), &Text can be not empty&, Toast.LENGTH_SHORT).show();
} catch (WriterException e) {
e.printStackTrace();
实现方法:
private static final int BLACK = 0xff000000;
//生成二维码
public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException {
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, &utf-8&);
BitMatrix matrix = new MultiFormatWriter().encode(str,
BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);
int width = matrix.getWidth();
int height = matrix.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y & y++) {
for (int x = 0; x & x++) {
if (matrix.get(x, y)) {
pixels[y * width + x] = BLACK;
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
2.生成条形码
调用方法:
//产生条形码
mBtnOneCode.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String contentString = qrStrEditText.getText().toString();
int size = contentString.length();
for (int i = 0; i & i++) {
int c = contentString.charAt(i);
if ((19968 &= c && c & 40623)) {
Toast.makeText(getApplicationContext(), &text not be chinese&, Toast.LENGTH_SHORT).show();
Bitmap mBmpOneCode =
if (contentString != null && !&&.equals(contentString)) {
mBmpOneCode = EncodingHandler.CreateOneDCode(contentString);
qrStrEditText.setText(&&);
mTextView.setText(contentString);
} catch (WriterException e) {
e.printStackTrace();
if (mBmpOneCode != null) {
mImageView.setImageBitmap(mBmpOneCode);
实现方法:
//生成条形码
public static Bitmap CreateOneDCode(String content) throws WriterException {
// 生成一维条码,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
BitMatrix matrix = new MultiFormatWriter().encode(content,
BarcodeFormat.CODE_128, 500, 200);
int width = matrix.getWidth();
int height = matrix.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y & y++) {
for (int x = 0; x & x++) {
if (matrix.get(x, y)) {
pixels[y * width + x] = BLACK;
3.扫描二维码、条形码
mButtonScan.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MipcaActivityCapture.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
五、实现效果图现在大部分的手机都具备自动对焦的拍摄功能,这意味着这些手机可以具备条码扫描的功能,手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片()等。
本文使用ZXing 1.6实现条码/二维码识别。是个很经典的条码/二维码识别的开源类库,很早就有开发者在J2ME上使用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力,而目前已经有不少Android手机具备自动对焦的功能。
本文代码运行的结果如下,使用91手机助手截图时,无法截取SurfaceView的实时图像:
本文使用了ZXing1.6的core,即把/zxing-1.6/core/下的src复制覆盖工程的src;另外还要使用到/zxing-1.6/android/下的PlanarYUVLuminanceSource.java。
PS:/zxing-1.6/android/ 是BarcodeScanner的源码,本文程序相当于BarcodeScanner的精简版,只保留最基本的识别功能。
本文源码工程下载地址:
源码目录结果如下图,ChecksumException.java下面还有很多源文件,截图尚未列出:
本文例子必须要开摄像头和自动对焦的权限,不然启动时会报异常,所需权限如下:
main.xml源码如下,main.xml必须要用到FrameLayout才能重叠控件实现&范围框&的效果:
testCamera.java是主类,负责控制Camera和对图像做解码,源码如下:
package com.testC
import java.util.T
import java.util.TimerT
import com.google.zxing.BinaryB
import com.google.zxing.MultiFormatR
import com.google.zxing.R
import com.google.zxing.Android.PlanarYUVLuminanceS
import com.mon.HybridB
import android.app.A
import android.graphics.B
import android.hardware.C
import android.os.B
import android.view.SurfaceV
import android.view.V
import android.widget.ImageV
import android.widget.TextV
public class testCamera extends Activity {
/** Called when the activity is first created. */
private SurfaceView sfvC
private SFHCamera sfhC
private ImageView imgV
private View centerV
private TextView txtScanR
private Timer mT
private MyTimerTask mTimerT
// 按照标准HVGA
final static int width = 480;
final static int height = 320;
int dstLeft, dstTop, dstWidth, dstH
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTitle("Android条码/二维码识别Demo-----hellogv");
imgView = (ImageView) this.findViewById(R.id.ImageView01);
centerView = (View) this.findViewById(R.id.centerView);
sfvCamera = (SurfaceView) this.findViewById(R.id.sfvCamera);
sfhCamera = new SFHCamera(sfvCamera.getHolder(), width, height,
previewCallback);
txtScanResult = (TextView) this.findViewById(R.id.txtScanResult);
// 初始化定时器
mTimer = new Timer();
mTimerTask = new MyTimerTask();
mTimer.schedule(mTimerTask, 0, 80);
class MyTimerTask extends TimerTask {
public void run() {
if (dstLeft == 0) {// 只赋值一次
dstLeft = centerView.getLeft() * width
/ getWindowManager().getDefaultDisplay().getWidth();
dstTop = centerView.getTop() * height
/ getWindowManager().getDefaultDisplay().getHeight();
dstWidth = (centerView.getRight() - centerView.getLeft())
/ getWindowManager().getDefaultDisplay().getWidth();
dstHeight = (centerView.getBottom() - centerView.getTop())
/ getWindowManager().getDefaultDisplay().getHeight();
sfhCamera.AutoFocusAndPreviewCallback();
* 自动对焦后输出图片
private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
// 取得指定范围的帧的数据
PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
data, width, height, dstLeft, dstTop, dstWidth, dstHeight);
// 取得灰度图
Bitmap mBitmap = source.renderCroppedGreyscaleBitmap();
// 显示灰度图
imgView.setImageBitmap(mBitmap);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
MultiFormatReader reader = new MultiFormatReader();
Result result = reader.decode(bitmap);
String strResult = "BarcodeFormat:"
+ result.getBarcodeFormat().toString() + "
+ result.getText();
txtScanResult.setText(strResult);
} catch (Exception e) {
txtScanResult.setText("Scanning");
SFHCamera.java是Camera控制类,源码如下:
package com.testC
import java.io.IOE
import android.graphics.PixelF
import android.hardware.C
import android.util.L
import android.view.SurfaceH
public class SFHCamera implements SurfaceHolder.Callback {
private SurfaceHolder holder =
private Camera mC
private int width,
private Camera.PreviewCallback previewC
public SFHCamera(SurfaceHolder holder, int w, int h,
Camera.PreviewCallback previewCallback) {
this.holder =
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
this.previewCallback = previewC
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);// 设置尺寸
parameters.setPictureFormat(PixelFormat.JPEG);
mCamera.setParameters(parameters);
mCamera.startPreview();// 开始预览
Log.e("Camera", "surfaceChanged");
public void surfaceCreated(SurfaceHolder arg0) {
mCamera = Camera.open();// 启动服务
mCamera.setPreviewDisplay(holder);// 设置预览
Log.e("Camera", "surfaceCreated");
} catch (IOException e) {
mCamera.release();// 释放
public void surfaceDestroyed(SurfaceHolder arg0) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();// 停止预览
Log.e("Camera", "surfaceDestroyed");
* 自动对焦并回调Camera.PreviewCallback
public void AutoFocusAndPreviewCallback() {
if (mCamera != null)
mCamera.autoFocus(mAutoFocusCallBack);
* 自动对焦
private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
if (success) { // 对焦成功,回调Camera.PreviewCallback
mCamera.setOneShotPreviewCallback(previewCallback);
其中testCamera.java的Camera.PreviewCallback previewCallback 是整个程序的逻辑核心,作为回调函数给SFHCamera.java的内部Camera类调用。
本文摘自:http://blog.csdn.net/hellogv/article/details/6101663

我要回帖

更多关于 zxing 二维码扫描优化 的文章

 

随机推荐