Android Zxing扫码加开灯效果实现

来源:互联网 发布:制作新闻联播视频软件 编辑:程序博客网 时间:2024/05/21 22:31

    笔记 Android ZXing 二维码、条形码扫描(加开灯效果)介绍

   刚刚实现了二维码以及条形码扫码,以及根据输入的信息生产二维码的功能。主要应用了eoe论坛大神的demo

然后自己加入了开灯以及关灯的效果,感觉还蛮实用的,记录一下,以后用的话可以直接copy,同时可以给有需要的同学分享。

   Android端效果:

                 


其中encoding包是在原基础上加上去的,功能是根据传入的字符串来生成二维码图片,返回一个Bitmap,其余的包是ZXing项目自带的。另外对扫描界面的布局也进行了修改,官方的扫描界面是横向的,大神改成了纵向的,并加入了顶部的Tab和取消按钮(camera.xml),另外还需要的一些文件是colors.xml、ids.xml,这些都是原本ZXing项目中自带的,最后就是libs下面的jar包。(这里我加入了打开灯关的按钮,其实这里我们可以设置很多效果,留待以后需要时再考虑)

接下来看如何使用,首先是把ZXing项目中的一些文件拷贝到我们自己的项目中,然后在Mainifest文件中进行配置权限:

    <uses-permission android:name="android.permission.VIBRATE" />    <uses-permission android:name="android.permission.CAMERA" />    <uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />
然后是扫描Activity的属性配置:

        <activity            android:configChanges="orientation|keyboardHidden"            android:name="com.zxing.activity.CaptureActivity"            android:screenOrientation="portrait"            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"            android:windowSoftInputMode="stateAlwaysHidden" >        </activity>
接下来是我们自己的配置文件:
<?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:background="@drawable/navbar"            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" />                 <!-- add by wj 2014-12.1 -->                <Button             android:id="@+id/btn_light"            android:layout_width="230dp"            android:layout_height="40dp"            android:layout_centerInParent="true"            android:layout_above="@id/btn_cancel_scan"            android:layout_marginBottom="10dp"            android:textSize="15sp"            android:textStyle="bold"            android:text="@string/open_light"/>                <!-- end by wj 2014-12-1 -->    </RelativeLayout></FrameLayout>

接下来是主Activity,主要功能是打开扫描框、显示扫描结果、根据输入的字符串生成二维码图片:

package com.ericssonlabs;import com.google.zxing.WriterException;import com.zxing.activity.CaptureActivity;import com.zxing.encoding.EncodingHandler;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class BarCodeTestActivity extends Activity {    /** Called when the activity is first created. */private TextView resultTextView;private EditText qrStrEditText;private ImageView qrImgImageView;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);        qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);        qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);                Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);        scanBarCodeButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//打开扫描界面扫描条形码或二维码Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptureActivity.class);startActivityForResult(openCameraIntent, 0);}});                Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);        generateQRCodeButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {String contentString = qrStrEditText.getText().toString();if (!contentString.equals("")) {//根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350)Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350);qrImgImageView.setImageBitmap(qrCodeBitmap);}else {Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();}} catch (WriterException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});    }@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);//处理扫描结果(在界面上显示)if (resultCode == RESULT_OK) {Bundle bundle = data.getExtras();String scanResult = bundle.getString("result");resultTextView.setText(scanResult);}}}
生成二维码主要在这里实现:

package com.zxing.encoding;import java.util.Hashtable;import android.graphics.Bitmap;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;/** * @author Ryan Tang * */public final 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;}}
最后是在哪里对扫描结果进行解码,进入CaptureActivity.java找到下面这个方法便可以对自己对结果进行操作:
/** * Handler scan result * @param result * @param barcode */public void handleDecode(Result result, Bitmap barcode) {inactivityTimer.onActivity();playBeepSoundAndVibrate();String resultString = result.getText();//FIXMEif (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);}CaptureActivity.this.finish();}


ok,基本要点上面都有提到。最后给上源码下载链接


Zxing扫码(带开灯效果)





0 0
原创粉丝点击