image.png
主要代碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fl_custom_detail_time"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginLeft="@dimen/margin10"
android:layout_marginRight="@dimen/margin10"
android:layout_weight="1"
android:orientation="vertical"
android:background="@color/colorffffff"
android:layout_marginBottom="@dimen/margin12"
android:visibility="visible">
<TextView
android:id="@+id/tv_default"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="請(qǐng)先填寫下方增員對(duì)象分類"
android:textColor="@color/color666666"
android:textSize="@dimen/text15"
android:visibility="gone" />
<android.support.constraint.ConstraintLayout
android:id="@+id/cl_tl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorffffff"
android:visibility="visible">
<LinearLayout
android:id="@+id/ll_add_staff_tishi"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_30dp"
android:gravity="center_vertical"
android:background="@color/colorffeacc"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin10"
android:background="@mipmap/tishi" />
<TextView
android:id="@+id/tv_add_staff_tishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin10"
android:textSize="@dimen/text10"
android:textColor="@color/colorff5300"
android:text="二維碼僅限此準(zhǔn)增員掃描,請(qǐng)勿多人使用。"
/>
</LinearLayout>
<TextView
android:id="@+id/tv_tl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingTop="@dimen/margin10"
android:paddingBottom="@dimen/margin10"
android:text="二維碼有效期為10秒璃哟,請(qǐng)及時(shí)完成掃碼"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/color333333"
app:layout_constraintTop_toBottomOf="@+id/ll_add_staff_tishi"
app:layout_constraintRight_toRightOf="parent" />
<FrameLayout
android:id="@+id/fl_QRcode"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/shape_add_staff_qrcode"
android:clickable="true"
app:layout_constraintBottom_toTopOf="@+id/ll_time"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_tl"
>
<ImageView
android:id="@+id/img_QRcode"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/margin2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</FrameLayout>
<TextView
android:id="@+id/tv_bl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@mipmap/add_staff_shuanxin"
android:drawablePadding="@dimen/margin6"
android:gravity="center"
android:paddingTop="@dimen/margin10"
android:paddingBottom="@dimen/margin10"
android:text="更新?tīng)顟B(tài)"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/color333333"
app:layout_constraintRight_toRightOf="parent" />
<LinearLayout
android:id="@+id/ll_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="@dimen/margin10"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/tv_bl"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableRight="@mipmap/add_staff_shijian"
android:drawablePadding="@dimen/margin10"
android:text="請(qǐng)掃描二維碼"
android:textColor="@color/color999999"
android:textSize="@dimen/text14" />
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin10"
android:drawablePadding="@dimen/margin7"
android:text="10s"
android:textColor="@color/colorff5722"
android:textSize="@dimen/text14" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/cl_tl2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorffffff"
android:visibility="gone">
<TextView
android:id="@+id/tv_tl2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingTop="@dimen/margin10"
android:paddingBottom="@dimen/margin10"
android:text="二維碼有效期為10秒氛琢,請(qǐng)及時(shí)完成掃碼"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<TextView
android:id="@+id/tv_bl2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="@dimen/margin6"
android:gravity="center"
android:paddingTop="@dimen/margin10"
android:paddingBottom="@dimen/margin10"
android:text="二維碼已失效,請(qǐng)重試随闪!"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<FrameLayout
android:id="@+id/fl_QRcode2"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/shape_add_staff_qrcode"
android:clickable="true"
app:layout_constraintBottom_toTopOf="@+id/tv_bl2"
app:layout_constraintTop_toBottomOf="@+id/tv_tl2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableTop="@mipmap/add_staff_shuaxin2"
android:drawablePadding="@dimen/margin20"
android:text="重新生成二維碼" />
</FrameLayout>
</android.support.constraint.ConstraintLayout>
</FrameLayout>
</LinearLayout>
二維碼生成代碼
/*展示數(shù)據(jù)*/
QRUrl = bean.getInfo().getLink();
// int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
// int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
// img_QRcode.measure(w, h);
// int height =img_QRcode.getMeasuredHeight();
// int width =img_QRcode.getMeasuredWidth();
// int width=ScreenUtils.getScreenHeight(getActivity());
int width = DensityUtil.dp2px(getActivity(), 200);//px
/*生成二維碼*/
mBitmap = QRCodeUtils.createQrCodeWithoutWhite(QRUrl, width, width);
if(mBitmap !=null){
img_QRcode.setImageBitmap(mBitmap);
}
countDown(9);
工具類
package com.example.rsq.qrcodescan;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.util.Log;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
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.HybridBinarizer;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 二維碼功能封裝,包括識(shí)別,生成二維碼,掃描識(shí)別二維碼
* @Author: renshiqian
* @Date: 2017/12/13
*/
public class QRCodeUtils {
/**
* 生成二維碼
* @param str
* @return
*/
public static Bitmap encodeAsBitmap(String str){
Bitmap bitmap = null;
BitMatrix result = null;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
try {
result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 200, 200);
// 使用 ZXing Android Embedded 要寫的代碼
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.createBitmap(result);
} catch (WriterException e){
e.printStackTrace();
} catch (IllegalArgumentException iae){
return null;
}
return bitmap;
}
/**
* 識(shí)別相冊(cè)圖片二維碼
* @param bitmap
* @return
*/
public static Result scanBitmap(Bitmap bitmap) {
if (bitmap == null) {
return null;
}
Map<DecodeHintType, Object> hints = new LinkedHashMap<>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF8");// 解碼設(shè)置編碼方式為:utf-8
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);//優(yōu)化精度
hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);//復(fù)雜模式阳似,開(kāi)啟PURE_BARCODE模式
Bitmap scanBitmap = Bitmap.createBitmap(bitmap);
int px[] = new int[scanBitmap.getWidth() * scanBitmap.getHeight()];
scanBitmap.getPixels(px, 0, scanBitmap.getWidth(), 0, 0, scanBitmap.getWidth(), scanBitmap.getHeight());
RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap.getWidth(), scanBitmap.getHeight(), px);
BinaryBitmap tempBitmap = new BinaryBitmap(new HybridBinarizer(source));
MultiFormatReader reader = new MultiFormatReader();
try {
return reader.decode(tempBitmap, hints);
} catch (NotFoundException e) {
Log.wtf("zcc", "scan:" + e.toString());
} finally {
reader.reset();
}
return null;
}
public static String recode(String str) {
String formart = "";
try {
boolean ISO = Charset.forName("ISO-8859-1").newEncoder().canEncode(str);
if (ISO) {
formart = new String(str.getBytes("ISO-8859-1"), "GB2312");
} else {
formart = str;
}
} catch (UnsupportedEncodingException e) {
Log.wtf("zcc", "scan recode:" + e.toString());
}
return formart;
}
/**
* 掃描二維碼
* @param activity
* 請(qǐng)重寫當(dāng)前activity的onActivityResult()方法
* resultCode == RESULT_OK = -1 為成功掃描二維碼
* Bundle bundle = data.getExtras();
* String scanResult = bundle.getString("result");為掃描結(jié)果
*/
public static void scanQRCode(Activity activity){
// 創(chuàng)建IntentIntegrator對(duì)象
IntentIntegrator intentIntegrator = new IntentIntegrator(activity);
// 設(shè)置自定義掃描Activity
intentIntegrator.setCaptureActivity(CustomCaptureActivity.class);
// 開(kāi)始掃描
intentIntegrator.initiateScan();
}
/**
* 生成不帶白邊的二維碼
* @param str
* @param width
* @param height
* @return
*/
public static Bitmap createQrCodeWithoutWhite(String str, int width, int height) {
try {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix matrix = new QRCodeWriter().encode(str, BarcodeFormat.QR_CODE, width, height);
matrix = deleteWhite(matrix);//刪除白邊
width = matrix.getWidth();
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] = Color.BLACK;
} else {
pixels[y * width + x] = Color.WHITE;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
} catch (Exception e) {
return null;
}
}
/**
* 生成帶白邊的二維碼
* @param str
* @param width
* @param height
* @return
*/
public static Bitmap createQrCodeWithWhite(String str, int width, int height) {
Bitmap bitmap = null;
BitMatrix result = null;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
try {
result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, width, height);
// 使用 ZXing Android Embedded 要寫的代碼
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.createBitmap(result);
} catch (WriterException e){
e.printStackTrace();
} catch (IllegalArgumentException iae){
return null;
}
return bitmap;
}
private static BitMatrix deleteWhite(BitMatrix matrix) {
int[] rec = matrix.getEnclosingRectangle();
int resWidth = rec[2] + 1;
int resHeight = rec[3] + 1;
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
resMatrix.clear();
for (int i = 0; i < resWidth; i++) {
for (int j = 0; j < resHeight; j++) {
if (matrix.get(i + rec[0], j + rec[1]))
resMatrix.set(i, j);
}
}
return resMatrix;
}
}