Android zxing创建和扫描二维码

1.在项目的libs目录下添加zxing.jar包,并在build中引用

implementation files('libs/zxing.jar')

2.在AndroidManifest.xml文件中添加权限

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />

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

3.创建生成二维码的工具类QRCodeUtil

package com.ruidde.csndresourcedemo.untils1;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import android.graphics.Bitmap;
import android.graphics.Canvas;

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 static android.graphics.Color.BLACK;

/**
 * 二维码生成工具类
 */
public class QRCodeUtil {
    /**
     * 生成二维码Bitmap
     *
     * @param str   内容
     * @param widthAndHeight  图片宽高
     */
    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.在Activity中点击按钮生成二维码

/**
 *  生成二维码
 * strEWM :二维码内容
 * */
btn_createEWM.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        img_erweima.setVisibility(View.VISIBLE);
        final String strEWM = "WifiAP" + "-" + "dcd1db3002d3" + "-" + "123456789";
        //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
        new Thread(new Runnable() {
            @Override
            public void run() {
                Bitmap success = null;
                try {
                    success = QRCodeUtil.createQRCode(strEWM, 300);
                } catch (WriterException e) {
                    e.printStackTrace();
                }

                final Bitmap finalSuccess = success;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        img_erweima.setImageBitmap(finalSuccess);
                    }
                });
            }

        }).start();
    }
});

5.自定义一些优化扫描二维码的工具类

创建扫一扫页面

package com.ruidde.csndresourcedemo;

import android.app.Activity;
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.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.ruidde.csndresourcedemo.zxing.camera.CameraManager;
import com.ruidde.csndresourcedemo.zxing.decoding.CaptureActivityHandler;
import com.ruidde.csndresourcedemo.zxing.decoding.InactivityTimer;
import com.ruidde.csndresourcedemo.zxing.view.ViewfinderView;

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

/**
 *  扫一扫界面
 * @author wfy
 */
public class CaptureActivity extends Activity implements SurfaceHolder.Callback, OnClickListener {
   private String tag=getClass().getSimpleName();
   public static final String SCAN_RESULT="scan_result";
   private CaptureActivityHandler handler;
   private ViewfinderView viewfinderView;
   private boolean hasSurface;
   /*******************解码格式*******在DecodeThead中初始化********/
   private Vector<BarcodeFormat> decodeFormats;
   /***生成qr图的字符的编码方式**/
   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 btn_scan_backward;
   private RelativeLayout rl_scan_bar;
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.captureactivity);
      CameraManager.init(getApplication());
      viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
      rl_scan_bar=(RelativeLayout) findViewById(R.id.rl_scan_bar);
      btn_scan_backward = (Button) findViewById(R.id.btn_scan_backward);
      hasSurface = false;
      inactivityTimer = new InactivityTimer(this);
      btn_scan_backward.setOnClickListener(this);
   }



   @Override
   protected void onResume() {
      super.onResume();
      SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
      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;
   }

   @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 {
         Intent intent = new Intent();
         Bundle bundle = new Bundle();
         bundle.putString(SCAN_RESULT, resultString);
         intent.putExtras(bundle);
         this.setResult(RESULT_OK, intent);
      }
      CaptureActivity.this.finish();
   }

   private void initCamera(SurfaceHolder surfaceHolder) {
      try {//setPreviewDisplay
         CameraManager.get().openDriver(surfaceHolder);
      } catch (IOException ioe) {
         return;
      } catch (RuntimeException e) {
         return;
      }
      if (handler == null) {
         //在此handler初始化时完成取景
         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;
   }
   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() {
      @Override
      public void onCompletion(MediaPlayer mediaPlayer) {
         mediaPlayer.seekTo(0);
      }
   };
   @Override
   public void onClick(View v) {
      // TODO Auto-generated method stub
      switch(v.getId()){
      case R.id.btn_scan_backward:
         finish();
         break;
      }
   }
}

扫一扫页面

扫描二维码后的结果

请点击下载链接,下载源码:https://download.csdn.net/download/yyxhzdm/12845207

谢谢,希望对你有所帮助!!!