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
谢谢,希望对你有所帮助!!!