QRUtils.java 源代码
package cn.hichip.zbar.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Vibrator;
import android.support.v4.view.ViewCompat;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import cn.hichip.zbar.Qr.Image;
import cn.hichip.zbar.Qr.ImageScanner;
import cn.hichip.zbar.Qr.Symbol;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.GlobalHistogramBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.File;
import java.util.Hashtable;
import java.util.Iterator;
public class QRUtils {
private static QRUtils instance;
private Context mContext;
private Bitmap scanBitmap;
public static QRUtils getInstance() {
if (instance == null) {
instance = new QRUtils();
}
return instance;
}
public String decodeQRcode(String str) throws Exception {
Bitmap grayscale = toGrayscale(compressImage(str));
return grayscale != null ? decodeQRcode(grayscale) : "";
}
public String decodeQRcode(ImageView imageView) throws Exception {
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
return bitmap != null ? decodeQRcode(bitmap) : "";
}
public String decodeQRcode(Bitmap bitmap) throws Exception {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] iArr = new int[width * height];
bitmap.getPixels(iArr, 0, width, 0, 0, width, height);
Image image = new Image(width, height, "RGB4");
image.setData(iArr);
ImageScanner imageScanner = new ImageScanner();
imageScanner.setConfig(0, 0, 0);
imageScanner.setConfig(64, 0, 1);
String str = null;
if (imageScanner.scanImage(image.convert("Y800")) != 0) {
Iterator<Symbol> it = imageScanner.getResults().iterator();
while (it.hasNext()) {
str = it.next().getData();
}
}
bitmap.recycle();
return str;
}
public String decodeQRcodeByZxing(String str) {
Result result = null;
if (TextUtils.isEmpty(str)) {
return null;
}
Hashtable hashtable = new Hashtable();
hashtable.put(DecodeHintType.CHARACTER_SET, "UTF-8");
Bitmap compressImage = compressImage(str);
int[] iArr = new int[compressImage.getWidth() * compressImage.getHeight()];
compressImage.getPixels(iArr, 0, compressImage.getWidth(), 0, 0, compressImage.getWidth(), compressImage.getHeight());
try {
result = new QRCodeReader().decode(new BinaryBitmap(new GlobalHistogramBinarizer(new RGBLuminanceSource(compressImage.getWidth(), compressImage.getHeight(), iArr))), hashtable);
} catch (ChecksumException | FormatException | NotFoundException unused) {
}
return result == null ? "" : result.getText();
}
public String decodeQRcodeByZxing(Bitmap bitmap) {
Result result;
Hashtable hashtable = new Hashtable();
hashtable.put(DecodeHintType.CHARACTER_SET, "UTF-8");
this.scanBitmap = bitmap;
int[] iArr = new int[bitmap.getWidth() * this.scanBitmap.getHeight()];
Bitmap bitmap2 = this.scanBitmap;
bitmap2.getPixels(iArr, 0, bitmap2.getWidth(), 0, 0, this.scanBitmap.getWidth(), this.scanBitmap.getHeight());
try {
result = new QRCodeReader().decode(new BinaryBitmap(new GlobalHistogramBinarizer(new RGBLuminanceSource(this.scanBitmap.getWidth(), this.scanBitmap.getHeight(), iArr))), hashtable);
} catch (ChecksumException | FormatException | NotFoundException unused) {
result = null;
}
return result == null ? "" : result.getText();
}
public String decodeBarcode(String str) {
Bitmap decodeFile = BitmapFactory.decodeFile(str);
return decodeFile != null ? decodeBarcode(decodeFile) : "";
}
public String decodeBarcode(ImageView imageView) {
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
return bitmap != null ? decodeBarcode(bitmap) : "";
}
public String decodeBarcode(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] iArr = new int[width * height];
bitmap.getPixels(iArr, 0, width, 0, 0, width, height);
Image image = new Image(width, height, "RGB4");
image.setData(iArr);
ImageScanner imageScanner = new ImageScanner();
imageScanner.setConfig(0, 0, 0);
imageScanner.setConfig(128, 0, 1);
imageScanner.setConfig(39, 0, 1);
imageScanner.setConfig(13, 0, 1);
imageScanner.setConfig(8, 0, 1);
imageScanner.setConfig(12, 0, 1);
imageScanner.setConfig(9, 0, 1);
String str = null;
if (imageScanner.scanImage(image.convert("Y800")) != 0) {
Iterator<Symbol> it = imageScanner.getResults().iterator();
while (it.hasNext()) {
str = it.next().getData();
}
}
return str;
}
public Bitmap createQRCode(String str) {
return createQRCode(str, 300, 300);
}
public Bitmap createQRCode(String str, int i, int i2) {
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Bitmap bitmap = null;
try {
Hashtable hashtable = new Hashtable();
hashtable.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hashtable.put(EncodeHintType.MARGIN, 1);
BitMatrix encode = multiFormatWriter.encode(new String(str.getBytes("UTF-8"), "ISO-8859-1"), BarcodeFormat.QR_CODE, i, i2, hashtable);
int width = encode.getWidth();
int height = encode.getHeight();
int[] iArr = new int[width * height];
for (int i3 = 0; i3 < height; i3++) {
int i4 = i3 * width;
for (int i5 = 0; i5 < width; i5++) {
iArr[i4 + i5] = encode.get(i5, i3) ? ViewCompat.MEASURED_STATE_MASK : -1;
}
}
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(iArr, 0, width, 0, 0, width, height);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
return bitmap;
}
}
public Bitmap createQRCodeAddLogo(String str, Bitmap bitmap) {
Bitmap createQRCode = createQRCode(str);
createQRCode.getHeight();
return createWaterMaskCenter(createQRCode, zoomImg(bitmap, ((int) (createQRCode.getWidth() * 0.3d)) / bitmap.getWidth()));
}
public Bitmap createQRCodeAddLogo(String str, int i, int i2, Bitmap bitmap) {
Bitmap createQRCode = createQRCode(str, i, i2);
createQRCode.getHeight();
return createWaterMaskCenter(createQRCode, zoomImg(bitmap, ((int) (createQRCode.getWidth() * 0.3d)) / bitmap.getWidth()));
}
@Deprecated
public Bitmap createBarcode(Context context, String str, int i, int i2) {
if (TextUtils.isEmpty(str)) {
throw new NullPointerException("contents not be null");
}
if (i == 0 || i2 == 0) {
throw new NullPointerException("desiredWidth or desiredHeight not be null");
}
return encodeAsBitmap(str, BarcodeFormat.CODE_128, i, i2);
}
public Bitmap createBarCodeWithText(Context context, String str, int i, int i2) {
return createBarCodeWithText(context, str, i, i2, null);
}
public Bitmap createBarCodeWithText(Context context, String str, int i, int i2, TextViewConfig textViewConfig) {
if (TextUtils.isEmpty(str)) {
throw new NullPointerException("contents not be null");
}
if (i == 0 || i2 == 0) {
throw new NullPointerException("desiredWidth or desiredHeight not be null");
}
Bitmap encodeAsBitmap = encodeAsBitmap(str, BarcodeFormat.CODE_128, i, i2);
return mixtureBitmap(encodeAsBitmap, createCodeBitmap(str, encodeAsBitmap.getWidth(), encodeAsBitmap.getHeight(), context, textViewConfig), new PointF(0.0f, i2));
}
private Bitmap encodeAsBitmap(String str, BarcodeFormat barcodeFormat, int i, int i2) {
BitMatrix bitMatrix;
try {
bitMatrix = new MultiFormatWriter().encode(str, barcodeFormat, i, i2, null);
} catch (WriterException e) {
e.printStackTrace();
bitMatrix = null;
}
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
int[] iArr = new int[width * height];
for (int i3 = 0; i3 < height; i3++) {
int i4 = i3 * width;
for (int i5 = 0; i5 < width; i5++) {
iArr[i4 + i5] = bitMatrix.get(i5, i3) ? ViewCompat.MEASURED_STATE_MASK : -1;
}
}
Bitmap createBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
createBitmap.setPixels(iArr, 0, width, 0, 0, width, height);
return createBitmap;
}
private Bitmap createCodeBitmap(String str, int i, int i2, Context context, TextViewConfig textViewConfig) {
if (textViewConfig == null) {
textViewConfig = new TextViewConfig();
}
TextView textView = new TextView(context);
textView.setLayoutParams(new LinearLayout.LayoutParams(-1, -2));
textView.setText(str);
textView.setTextSize(textViewConfig.size == 0.0f ? textView.getTextSize() : textViewConfig.size);
textView.setHeight(i2);
textView.setGravity(textViewConfig.gravity);
textView.setMaxLines(textViewConfig.maxLines);
textView.setWidth(i);
textView.setDrawingCacheEnabled(true);
textView.setTextColor(textViewConfig.color);
textView.measure(View.MeasureSpec.makeMeasureSpec(0, 0), View.MeasureSpec.makeMeasureSpec(0, 0));
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.buildDrawingCache();
return textView.getDrawingCache();
}
public static class TextViewConfig {
private float size;
private int gravity = 17;
private int maxLines = 1;
private int color = ViewCompat.MEASURED_STATE_MASK;
public void setGravity(int i) {
this.gravity = i;
}
public void setMaxLines(int i) {
this.maxLines = i;
}
public void setColor(int i) {
this.color = i;
}
public void setSize(float f) {
this.size = f;
}
}
private Bitmap mixtureBitmap(Bitmap bitmap, Bitmap bitmap2, PointF pointF) {
if (bitmap == null || bitmap2 == null || pointF == null) {
return null;
}
Bitmap createBitmap = Bitmap.createBitmap(Math.max(bitmap.getWidth(), bitmap2.getWidth()), bitmap.getHeight() + bitmap2.getHeight(), Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(createBitmap);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, (Paint) null);
canvas.drawBitmap(bitmap2, pointF.x, pointF.y, (Paint) null);
canvas.save(31);
canvas.restore();
return createBitmap;
}
private Bitmap createWaterMaskCenter(Bitmap bitmap, Bitmap bitmap2) {
return createWaterMaskBitmap(bitmap, bitmap2, (bitmap.getWidth() - bitmap2.getWidth()) / 2, (bitmap.getHeight() - bitmap2.getHeight()) / 2);
}
private Bitmap createWaterMaskBitmap(Bitmap bitmap, Bitmap bitmap2, int i, int i2) {
if (bitmap == null) {
return null;
}
Bitmap createBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(createBitmap);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, (Paint) null);
canvas.drawBitmap(bitmap2, i, i2, (Paint) null);
canvas.save(31);
canvas.restore();
return createBitmap;
}
private Bitmap zoomImg(Bitmap bitmap, float f) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(f, f);
return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
}
public boolean isMIUI() {
return "xiaomi".equalsIgnoreCase(Build.MANUFACTURER);
}
public int getScreenWidth(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService("window");
Point point = new Point();
if (Build.VERSION.SDK_INT >= 17) {
windowManager.getDefaultDisplay().getRealSize(point);
} else {
windowManager.getDefaultDisplay().getSize(point);
}
return point.x;
}
public int getScreenHeight(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService("window");
Point point = new Point();
if (Build.VERSION.SDK_INT >= 17) {
windowManager.getDefaultDisplay().getRealSize(point);
} else {
windowManager.getDefaultDisplay().getSize(point);
}
return point.y;
}
public boolean isScreenOriatationPortrait(Context context) {
return context.getResources().getConfiguration().orientation == 1;
}
public float getFingerSpacing(MotionEvent motionEvent) {
float x = motionEvent.getX(0) - motionEvent.getX(1);
float y = motionEvent.getY(0) - motionEvent.getY(1);
return (float) Math.sqrt((x * x) + (y * y));
}
private Bitmap toGrayscale(Bitmap bitmap) {
Bitmap createBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(createBitmap);
Paint paint = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0.0f);
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
canvas.drawBitmap(bitmap, 0.0f, 0.0f, paint);
return createBitmap;
}
private Bitmap compressImage(String str) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
this.scanBitmap = BitmapFactory.decodeFile(str, options);
options.inJustDecodeBounds = false;
int max = Math.max((int) (options.outHeight / 800.0f), (int) (options.outWidth / 800.0f));
options.inSampleSize = max > 0 ? max : 1;
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeFile(str, options);
}
public boolean deleteTempFile(String str) {
File file = new File(str);
return file.exists() && file.isFile() && file.delete();
}
public void getVibrator(Context context) {
((Vibrator) context.getSystemService("vibrator")).vibrate(new long[]{0, 50, 0, 0}, -1);
}
}