`
rayln
  • 浏览: 424655 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

zxing条形码扫描

 
阅读更多
参考http://blog.csdn.net/hellogv/article/details/6101663
使用zxing的第三方包. http://code.google.com/p/zxing
请引入一个core.jar和PlanarYUVLuminanceSource.java文件. 下载附件并打开
代码如下:

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.camera"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".CameraActivity" android:screenOrientation="landscape"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>    
    <uses-feature android:name="android.hardware.camera" />    
    <uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>


/res/anim/alhp.xml
<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">  
    <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="2000" android:repeatCount="-1"/>  
</set>


main.xml
<?xml version="1.0" encoding="utf-8"?>    
<FrameLayout android:id="@+id/FrameLayout01"    
    android:layout_width="fill_parent" android:layout_height="fill_parent"    
    xmlns:android="http://schemas.android.com/apk/res/android">    
    <SurfaceView android:layout_height="fill_parent"    
        android:id="@+id/sfvCamera" android:layout_width="fill_parent"></SurfaceView>    
    <RelativeLayout android:id="@+id/RelativeLayout01"    
        android:layout_height="fill_parent" android:layout_width="fill_parent">    
        <ImageView android:id="@+id/ImageView01"    
            android:layout_height="100dip" android:layout_width="160dip"></ImageView>    
        <View android:layout_centerVertical="true"    
            android:layout_centerHorizontal="true" android:layout_width="300dip"    
            android:background="#55FF6666" android:id="@+id/centerView"    
            android:layout_height="180dip"></View>    
        <TextView android:layout_centerHorizontal="true"    
            android:layout_width="wrap_content" android:layout_below="@+id/centerView"    
            android:layout_height="wrap_content" android:text="Scanning..."    
            android:id="@+id/txtScanResult" android:textColor="#FF000000"></TextView>    
    </RelativeLayout>   
    <View android:id="@+id/animationLine" android:layout_width="fill_parent" android:layout_height="2px" android:background="#FF9790" android:layout_gravity="center_vertical"></View>  
</FrameLayout> 


主Activity文件:
package com.camera;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.util.PlanarYUVLuminanceSource;
import com.util.SFHCamera;
public class CameraActivity extends Activity {    
    /** Called when the activity is first created. */    
    private SurfaceView sfvCamera;    
    private SFHCamera sfhCamera;    
    private ImageView imgView;    
    private View centerView;    
    private TextView txtScanResult;    
    private Timer mTimer;    
    private MyTimerTask mTimerTask;    
    // 按照标准HVGA    
    final static int width = 480;    
    final static int height = 320;    
    int dstLeft, dstTop, dstWidth, dstHeight;    
    @Override    
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        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, 2000);    
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.alph);  
        ((View)findViewById(R.id.animationLine)).startAnimation(animation);
    }    
        
    class MyTimerTask extends TimerTask {    
        @Override    
        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())* width    
                        / getWindowManager().getDefaultDisplay().getWidth());    
                dstHeight = (centerView.getBottom() - centerView.getTop())* height    
                        / getWindowManager().getDefaultDisplay().getHeight();    
                System.out.println("dstLeft:"+dstLeft+"   dstTop:"+dstTop+"   dstWidth:"+dstWidth+"   dstHeight:"+dstHeight);
                sfhCamera.AutoFocusAndPreviewCallback();
            }    
            
        }    
    }    
    /**  
     *  自动对焦后输出图片  
     */    
    private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {    
        @Override    
        public void onPreviewFrame(byte[] data, Camera camera) {   
            //取得指定范围的帧的数据    
            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, dstLeft, dstTop, dstWidth, dstHeight,false);    
            //取得灰度图    
            Bitmap mBitmap = source.renderCroppedGreyscaleBitmap();    
            //显示灰度图    
            imgView.setImageBitmap(mBitmap);    
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));    
            MultiFormatReader reader = new MultiFormatReader();    
            try {    
            	saveImage(mBitmap);
            	Hashtable hints = new Hashtable();  
                hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");  
                Result result = reader.decode(bitmap,hints);    
                String strResult = "BarcodeFormat:"    
                        + result.getBarcodeFormat().toString() + "  text:"    
                        + result.getText();    
                txtScanResult.setText(strResult);    
            } catch (Exception e) {    
                txtScanResult.setText("Scanning");   
                sfhCamera.AutoFocusAndPreviewCallback();
            }    
        }    
    };   
    @Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
    	if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){  
    		sfhCamera.closeCamera();
    	}
		return super.onKeyDown(keyCode, event);
	}
	@Override
	protected void onResume() {
		if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		}
		super.onResume();
	}
	
	private void saveImage(Bitmap mBitmap){
		File file=new File("/sdcard/feng.png"); 
        try { 
            FileOutputStream out=new FileOutputStream(file); 
            if(mBitmap.compress(Bitmap.CompressFormat.PNG, 50, out)){ 
                out.flush(); 
                out.close(); 
            } 
        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
	}
}  


SFHCamera.java
package com.util;
import java.io.IOException;    
import android.graphics.PixelFormat;    
import android.hardware.Camera;    
import android.util.Log;    
import android.view.SurfaceHolder;    
public class SFHCamera implements SurfaceHolder.Callback{    
    private SurfaceHolder holder = null;    
    private Camera mCamera;    
    private int width,height;    
    private Camera.PreviewCallback previewCallback;    
        
    public SFHCamera(SurfaceHolder holder,int w,int h,Camera.PreviewCallback previewCallback) {    
        this.holder = holder;      
        this.holder.addCallback(this);      
        this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    
        width=w;    
        height=h;    
        this.previewCallback=previewCallback;    
    }    
        
    @Override    
    public void surfaceChanged(SurfaceHolder arg0, int format, int w, int h) {    
        Camera.Parameters parameters = mCamera.getParameters();    
        parameters.setPreviewSize(width, height);//设置尺寸      
        parameters.setPictureFormat(PixelFormat.JPEG);    
//        parameters.set("orientation", "portrait");
        mCamera.setParameters(parameters);    
        
        mCamera.startPreview();//开始预览    
        Log.e("Camera","surfaceChanged");    
    }    
    @Override    
    public void surfaceCreated(SurfaceHolder arg0) {    
        mCamera = Camera.open();//启动服务      
//        mCamera.setDisplayOrientation(90);
        try {      
            mCamera.setPreviewDisplay(holder);//设置预览     
            Log.e("Camera","surfaceCreated");    
        } catch (IOException e) {      
            mCamera.release();//释放      
            mCamera = null;      
        }    
            
    }    
    @Override    
    public void surfaceDestroyed(SurfaceHolder arg0) {    
/*        mCamera.setPreviewCallback(null);    
        mCamera.stopPreview();//停止预览      
        mCamera = null;    */
        Log.e("Camera","surfaceDestroyed");    
    }    
    /**  
     * 自动对焦并回调Camera.PreviewCallback  
     */    
    public void AutoFocusAndPreviewCallback()    
    {    
        if(mCamera!=null)    
            mCamera.autoFocus(mAutoFocusCallBack);    
    }    
        
    /**  
     * 自动对焦  
     */    
    private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() {      
              
        @Override      
        public void onAutoFocus(boolean success, Camera camera) {   
        	mCamera.setOneShotPreviewCallback(previewCallback);       
        }      
    };    
     public void closeCamera(){
    	 mCamera.stopPreview();
    	 mCamera.release();
    	 mCamera = null;
     }
    
}
分享到:
评论
3 楼 liangzedong 2012-09-06  
Dear 楼主,
     按照您的步骤做了,但是在真机上面运行后报错,本人愚笨,能否把您的demo发给我,我的邮箱495014644@qq.com ,感谢至极!
2 楼 rayln 2011-11-15  
web8610 写道
兄弟 这个代码缺文件 R.anim.alph R.id.animationLine 能不能发给我啊 77892906@qq.com 万分感谢


兄弟, 不好意思哈, 更新了部分,没更新全. 横线动画部分没更新. 你看看代码我更新了, 加了alph.xml动画效果, 还有就是main.xml中加入了一个View显示一条横线!
1 楼 web8610 2011-11-15  
兄弟 这个代码缺文件 R.anim.alph R.id.animationLine 能不能发给我啊 77892906@qq.com 万分感谢

相关推荐

    ZXing条形码扫描

    标题“ZXing条形码扫描”指的是使用ZXing库进行条形码的读取和解析。ZXing支持多种条码格式,包括常见的EAN-13、UPC-A、QR Code、Data Matrix、Aztec Code等。在Android应用中,ZXing通常通过Camera源来捕获图像,...

    zxing条形码扫描DEMO

    "ZXing条形码扫描DEMO"是基于ZXing库的一个简单示例,帮助开发者快速理解如何在Android应用中实现条形码扫描。 在这个DEMO中,有两个关键的文件部分: 1. **Jar包**:这里提到的两个`.jar`文件很可能是ZXing的核心...

    android zxing条码扫描源码

    《Android Zxing条码扫描源码解析》 在Android应用开发中,Zxing(又称为ZXing,意为“快速可扩展的二进制解码”)是一个强大的开源项目,专注于各种类型的条码扫描和生成。它提供了跨平台的库,使得开发者能够轻松...

    安卓ZXING条码扫描无错版

    【安卓ZXING条码扫描无错版】是一个专为Android平台设计的条形码和二维码扫描工具,基于开源项目ZXing(Zebra Crossing)进行优化和调试,确保了其在运行过程中不会出现任何错误,提供了稳定且高效的扫描体验。ZXing...

    Zxing条形码二维码扫描

    【Zxing条形码二维码扫描】是一个针对移动设备的开源项目,主要功能是实现条形码和二维码的扫描与解码。Zxing,全称"ZXing (Zebra Crossing)",是一个多平台的、开放源代码的条码读取库。它的目标是提供一种简单、...

    Android版ZXing条码扫描程序3.2版

    google开源项目ZXing条码扫描Android版最新程序,3.2版

    ZXing条码扫描精简版

    标题“ZXing条码扫描精简版”表明这是ZXing原版库的一个轻量级版本,开发者已经将其裁剪,去除了不常用的功能,专注于条码和二维码的扫描。对于那些只需要基本扫描功能且不希望引入过多额外代码的开发者来说,这样的...

    Android Zxing包 调用摄像头扫描

    总之,集成Zxing到Android应用中,可以让你轻松实现条码扫描功能。但要注意,良好的用户体验和性能优化是关键。在实际开发过程中,你可能需要根据具体需求进行定制和调整,以满足不同场景的应用。

    Android-zxing条码扫描视图

    **Android-zxing条码扫描视图** 在Android应用开发中,条码扫描功能是一个常见的需求,用于读取商品信息、二维码链接等数据。ZXing(Zebra Crossing)是一个开源项目,提供了一套全面的条码读取库,适用于多种平台...

    条码扫描器

    综上所述,【条码扫描器】是一个针对Android平台优化过的条码扫描解决方案,它简化了复杂的ZXing库,使初学者能快速上手。通过理解并运用其中的技术,开发者可以构建出高效、功能丰富的条码扫描应用。

    使用zxing扫描二维码 条形码 完整DEMO下载 自定义扫描框

    这个名为`TwoBarCodesDemo`的压缩包可能包含了一个示例项目,展示了如何结合以上知识点,实现一个能自定义扫描框的二维码和条形码扫描器。下载并研究此DEMO,可以帮助你更好地理解和运用ZXing库。

    Zxing条形码和二维码扫描

    《Zxing:打造高效能的条形码与二维码扫描应用》 Zxing,全称“ZXing,意为“zebra crossing”(斑马线),是一个开源的、跨平台的条形码和二维码读取库。它允许开发者轻松地集成条码和二维码扫描功能到他们的应用...

    自定义UI实现高仿微信扫一扫二维码条形码扫描,集成ZXing包实现项目需求功能

    总的来说,这个项目为开发者提供了一种实现自定义UI的二维码和条形码扫描功能的方法,利用了ZXing的强大解码能力,同时保持了与应用整体风格的一致性,对于需要类似功能的Android开发者来说具有很高的参考价值。...

    app.zip_ZXing _android_zxing扫描app_zxing扫码器app_二维码

    本篇文章将详细介绍ZXing在Android开发中的应用以及如何使用ZXing创建一个简单的扫码器APP。 首先,我们需要理解ZXing的核心功能。ZXing提供了多种条码和二维码的编码与解码能力,包括但不限于QR码、Code 128、EAN-...

    安卓ZXing扫码.zip

    这个“安卓ZXing扫码.zip”文件包含的应该是ZXing库的最新版本,专为Android设备优化,以提供快速、稳定的条码扫描功能。下面将详细介绍ZXing库以及其在Android开发中的应用。 ZXing(二维码)库是Google开发的一个...

    Python zxing 库(条形码二维码识别)

    ZXing,又称为“条形码扫描器”,是一个开源的、多平台的二维码和一维条形码读取库。在Python中,我们可以通过调用ZXing的Java接口来实现相同的功能,这通常通过Java的Jython接口或者使用Java的`java.lang.reflect`...

    android Zxing扫描二维码条形码功能仿微信自定义扫码框扫描线边框样式Android studio版本

    Zxing(又名ZXing,意为“zebra crossing”)是一个开源项目,提供了跨平台的多种条码读取功能,包括二维码和条形码。在这个项目中,我们将讨论如何在Android Studio环境下,利用Zxing库来实现一个仿微信的自定义扫...

    android 使用zxing core 进行条形码扫描

    3. **初始化条形码扫描器** - 创建一个`CaptureActivity`,继承自`Activity`,并实现` BarrettCodeReader`的回调接口`DecodeCallback`。 - 在`onResume()`方法中开启相机预览和扫描,`onPause()`时关闭。 4. **...

Global site tag (gtag.js) - Google Analytics