Android扫描二维码及生成二维码Demo

制作二维码扫描及生成Demo首先要导入Google Zxing包code.jar。

Zxing源码及jar包下载地址:http://code.google.com/p/zxing/

Demo下载地址:http://download.csdn.net/detail/ericfantastic/9070921

二维码扫描及生成二维码Demo效果图:

      

1、导入相关的Zxing类及关键code.jar包:


2、MainActivity的布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/img_touxiang"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="center_horizontal"
            />

         <TextView 
             android:id="@+id/text_id"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="0dp"
             android:textColor="#3E8DDE"
             android:textSize="15sp"
             android:text="生成的二维码"
             android:layout_gravity="center_horizontal"/>
         
        <Button 
            android:id="@+id/btn_change"
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:text="生成二维码"
            android:textColor="#fff"
            android:layout_marginTop="70dp"
            android:layout_marginLeft="70dp"
            android:layout_marginRight="60dp"
            android:background="@drawable/buttonbg" />
         <Button 
            android:id="@+id/btn_scan"
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:text="扫描二维码"
            android:textColor="#fff"
            android:layout_marginTop="50dp"
            android:layout_marginLeft="70dp"
            android:layout_marginRight="60dp"
            android:background="@drawable/buttonbg" />
        <TextView 
            android:id="@+id/text_loginpro"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="转换遇到问题?"
            android:textColor="#3E8DDE"
            android:textSize="15sp" 
            android:layout_marginTop="10dp"
            android:layout_gravity="center_horizontal"
            android:clickable="true"/>
        
    </LinearLayout>
   	
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="250dp"
        >
         <ImageView 
             	 android:layout_gravity="bottom"
                 android:layout_width="25dp"
                 android:layout_height="25dp"
                 android:background="@drawable/suo"
                 android:layout_marginLeft="70dp"
                 
                 />

             <EditText
                 android:id="@+id/edit_password"
                 android:layout_width="180dp"
                 android:layout_height="wrap_content"
                 
                 android:textSize="15sp"
                 android:hint="请输入转换内容"
                 android:textColor="#000" />

             <ImageButton 
                 android:id="@+id/btn_reset"
                 android:layout_gravity="bottom"
                 android:layout_width="25dp"
                 android:layout_height="25dp"
                 android:background="@drawable/x"
                 />
    </LinearLayout>
    	

</RelativeLayout>
3、主界面MainActivity.java

package com.eric.activity;



import java.util.Hashtable;

import com.eric.qrcode.R;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {

	
	private TextView text_id,text_loginpro,text_more;
	private Button btn_scan,btn_change;
	private ImageButton btn_reset;
	private EditText edit_password;
	private ImageView img;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		img = (ImageView) findViewById(R.id.img_touxiang);
		text_id = (TextView) findViewById(R.id.text_id);
		text_loginpro =(TextView) findViewById(R.id.text_loginpro);
		btn_change = (Button) findViewById(R.id.btn_change);
		btn_scan = (Button) findViewById(R.id.btn_scan);
		btn_reset = (ImageButton) findViewById(R.id.btn_reset);
		edit_password = (EditText) findViewById(R.id.edit_password);
		
		btn_scan.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, CaptureActivity.class);
				startActivity(intent);
			}
		}) ;
		
		btn_change.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				try {
					String code = edit_password.getText().toString();
					Bitmap codeBitmap = EncodingHandler.createQRCode(code,220);
					img.setImageBitmap(codeBitmap);
				} catch (WriterException e) {
					e.printStackTrace();
				}
			}
		});
		
	}
	

	//生成二维码
	public final static class EncodingHandler {   
	    private static final int BLACK = 0xff000000;   
	       
	    public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException {   
	        Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();     
	        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 < height; y++) {   
	            for (int x = 0; x < width; 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);   
	        return bitmap;   
	    }   
	}   
}

4、CaptureActivity的布局文件capture.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

    <com.zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:orientation="vertical" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="Scan Barcode"
            android:textColor="@android:color/white"
            android:textSize="18sp"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_cancel_scan"
            android:layout_width="230dp"
            android:layout_height="40dp"
            android:layout_alignParentBottom="true"
            android:layout_centerInParent="true"
            android:layout_marginBottom="75dp"
            android:text="Cancel"
            android:textSize="15sp"
            android:textStyle="bold" />
        
    </RelativeLayout>

</FrameLayout>
5、扫描二维码CaptureActivity.java

package com.eric.activity;

import java.io.IOException;
import java.util.Vector;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.eric.qrcode.R;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;

import com.zxing.camera.CameraManager;
import com.zxing.decoding.CaptureActivityHandler;
import com.zxing.decoding.InactivityTimer;
import com.zxing.view.ViewfinderView;

public class CaptureActivity extends Activity implements Callback {

	private CaptureActivityHandler handler;
	private ViewfinderView viewfinderView;
	private boolean hasSurface;
	private Vector<BarcodeFormat> decodeFormats;
	private String characterSet;
	private InactivityTimer inactivityTimer;
	private MediaPlayer mediaPlayer;
	private boolean playBeep;
	private static final float BEEP_VOLUME = 0.10f;
	private boolean vibrate;
	private Button cancelScanButton;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.capture);
		//ViewUtil.addTopView(getApplicationContext(), this, R.string.scan_card);
		CameraManager.init(getApplication());
		viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
		cancelScanButton = (Button) this.findViewById(R.id.btn_cancel_scan);
		hasSurface = false;
		inactivityTimer = new InactivityTimer(this);
	}

	@Override
	protected void onResume() {
		super.onResume();
		SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (hasSurface) {
			initCamera(surfaceHolder);
		} else {
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		decodeFormats = null;
		characterSet = null;

		playBeep = true;
		AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			playBeep = false;
		}
		initBeepSound();
		vibrate = true;
		
		//quit the scan view
		cancelScanButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				CaptureActivity.this.finish();
			}
		});
	}

	@Override
	protected void onPause() {
		super.onPause();
		if (handler != null) {
			handler.quitSynchronously();
			handler = null;
		}
		CameraManager.get().closeDriver();
	}

	@Override
	protected void onDestroy() {
		inactivityTimer.shutdown();
		super.onDestroy();
	}
	
	/**
	 * Handler scan result
	 * @param result
	 * @param barcode
	 */
	public void handleDecode(Result result, Bitmap barcode) {
		inactivityTimer.onActivity();
		playBeepSoundAndVibrate();
		String resultString = result.getText();
		//FIXME
		if (resultString.equals("")) {
			Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
		}else {
//			System.out.println("Result:"+resultString);
			/*Intent resultIntent = new Intent();
			Bundle bundle = new Bundle();
			bundle.putString("result", resultString);
			resultIntent.putExtras(bundle);
			this.setResult(RESULT_OK, resultIntent);*/
			AlertDialog resutlDialog = new AlertDialog.Builder(CaptureActivity.this).create();
            resutlDialog.setTitle("扫描结果");
            resutlDialog.setMessage(resultString);
            resutlDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() 
            {
                @Override
                public void onClick(DialogInterface dialog, int which) 
                {
                    dialog.dismiss();
                }
            });    
            resutlDialog.show();
		}
		//CaptureActivity.this.finish();
	}
	
	private void initCamera(SurfaceHolder surfaceHolder) {
		try {
			CameraManager.get().openDriver(surfaceHolder);
		} catch (IOException ioe) {
			return;
		} catch (RuntimeException e) {
			return;
		}
		if (handler == null) {
			handler = new CaptureActivityHandler(this, decodeFormats,
					characterSet);
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (!hasSurface) {
			hasSurface = true;
			initCamera(holder);
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		hasSurface = false;

	}

	public ViewfinderView getViewfinderView() {
		return viewfinderView;
	}

	public Handler getHandler() {
		return handler;
	}

	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);
			try {
				mediaPlayer.setDataSource(file.getFileDescriptor(),
						file.getStartOffset(), file.getLength());
				file.close();
				mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
				mediaPlayer.prepare();
			} catch (IOException e) {
				mediaPlayer = null;
			}
		}
	}

	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);
		}
	};

}






  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值