android studio zxing 生成和掃描二維碼

加依賴

 	implementation 'com.journeyapps:zxing-android-embedded:3.6.0'  //生成
    implementation 'com.google.zxing:javase:3.0.0'

MainActivity

package wlt.com.hyjj;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    TextView jieguo;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        init();
    }
    Handler handler=new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {

            if (msg.arg1==101){
                imageView.setImageBitmap((Bitmap) msg.obj);
            }
            return true;
        }
    });
    public  void init(){
        jieguo=(TextView)this.findViewById(R.id.jieguo);
        imageView=(ImageView)this.findViewById(R.id.imgscar);
    }

   

    /**
     * 生成二維碼1
     */

    public static Bitmap createBitmap(String str){
        Bitmap bitmap = null;
        BitMatrix result = null;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 400, 400);
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(result);
        } catch (WriterException e){
            e.printStackTrace();
        } catch (IllegalArgumentException iae){
            return null;
        }
        return bitmap;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        if (requestCode == 101) {
            System.out.print("=====101=======");
            IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data);
            final String qrContent = scanResult.getContents();
            Toast.makeText(MainActivity.this, "掃描結果:" + qrContent, Toast.LENGTH_SHORT).show();
            jieguo.setText(qrContent);
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.item,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected( MenuItem item) {
        switch (item.getItemId()){

            case R.id.bdtp:
                Bitmap bitmap =zxing_Utlis.QRCode.createQRCode("https://blog.csdn.net/qq_38218307");
                Message mess=new Message();
                mess.arg1=101;
                mess.obj=bitmap;
                handler.sendMessage(mess);
                if (bitmap!=null){
                    Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.dtp:
                Bitmap bit=  BitmapFactory.decodeResource(getResources(),R.drawable.s);
                Bitmap bitmaps=  zxing_Utlis.QRCode.createQRCodeWithLogo("https://blog.csdn.net/qq_38218307",bit);
                Message messs=new Message();
                messs.arg1=101;
                messs.obj=bitmaps;
                handler.sendMessage(messs);
                if (bitmaps!=null){
                    Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.sb:
                //打開掃描界面
                IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this);
                intentIntegrator.setOrientationLocked(false);
                intentIntegrator.setCaptureActivity(ScanActivity.class); // 設置自定義的activity是QRActivity 自定義掃描界面
                intentIntegrator.setRequestCode(101);
                intentIntegrator.initiateScan();

                break;
            case R.id.scsb:
                Intent intent=new Intent(MainActivity.this,Uri_Utlis.class);
                startActivity(intent);

                break;

                default:

        }
        return true;
    }
}

content_main佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    >

    <ImageView
        android:id="@+id/imgscar"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@drawable/ic_launcher_background" />

    <LinearLayout
        android:layout_marginTop="50dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        />

    <TextView
        android:textSize="20dp"
        android:layout_marginTop="20dp"
        android:id="@+id/jieguo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello 這裏是結果!"

        />

</LinearLayout>

menu


<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
    <item android:id="@+id/bdtp" android:title="不帶圖片生成" />
    <item android:id="@+id/dtp" android:title="帶圖片生成" />
    <item android:id="@+id/sb" android:title="識別" />
    <item android:id="@+id/scsb" android:title="相冊識別" />
</menu>

zxing_Utlis

	 下面這個方法 我在網上搬得 磚 改了好多次 原地址找不到了 我貼上 他們的博客  找不到了  。。

https://blog.csdn.net/wxb141001yxx/article/details/80786680

https://blog.csdn.net/lc547913923/article/details/100022424

package wlt.com.hyjj;

import android.graphics.Bitmap;
import android.graphics.Matrix;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.util.Hashtable;

public class zxing_Utlis {

    public static class QRCode {
        /**
         * 生成二維碼,默認大小爲500*500
         * @param url 需要生成二維碼的網址,也可以是文字
         * @param //xize 需要生成二維碼的大小()
         * @return bitmap
         */
        public static Bitmap createQRCode(String url) {
            return createQRCode(url, 500);
        }
        public static Bitmap createQRCode(String url, int size) {
            try {
                Hashtable<EncodeHintType, String> hints = new Hashtable<>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                BitMatrix bitMatrix = new QRCodeWriter().encode(url,
                        BarcodeFormat.QR_CODE, size, size, hints);
                int[] pixels = new int[size * size];
                for (int y = 0; y < size; y++) {
                    for (int x = 0; x < size; x++) {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * size + x] = 0xff000000;
                        } else {
                            pixels[y * size + x] = 0xffffffff;
                        }

                    }
                }
                Bitmap bitmap = Bitmap.createBitmap(size, size,
                        Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
                return null;
            }
        }

        /**
         * 生成帶logo的二維碼,默認二維碼的大小爲500,logo爲二維碼的1/5
         * @param url 需要生成二維碼的文字、網址等
         * @param size 需要生成二維碼的大小()
         * @param mBitmap logo文件
         * @return bitmap
         */
        private static int IMAGE_HALFWIDTH = 50;//寬度值,影響中間圖片大小
        public static Bitmap createQRCodeWithLogo(String url, Bitmap mBitmap) {
            return createQRCodeWithLogo(url,500,mBitmap);
        }
        public static Bitmap createQRCodeWithLogo(String url, int size, Bitmap mBitmap) {
            try {
                IMAGE_HALFWIDTH = size/10;
                Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                /*
                 * 設置容錯級別,默認爲ErrorCorrectionLevel.L
                 * 因爲中間加入logo所以建議你把容錯級別調至H,否則可能會出現識別不了
                 */
                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                BitMatrix bitMatrix = new QRCodeWriter().encode(url,
                        BarcodeFormat.QR_CODE, size, size, hints);
                int width = bitMatrix.getWidth();//矩陣高度
                int height = bitMatrix.getHeight();//矩陣寬度
                int halfW = width / 2;
                int halfH = height / 2;

                Matrix m = new Matrix();
                float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth();
                float sy = (float) 2 * IMAGE_HALFWIDTH
                        / mBitmap.getHeight();
                m.setScale(sx, sy);

                //設置縮放信息
                //將logo圖片按martix設置的信息縮放
                mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,
                        mBitmap.getWidth(), mBitmap.getHeight(), m, false);

                int[] pixels = new int[size * size];
                for (int y = 0; y < size; y++) {
                    for (int x = 0; x < size; x++) {
                        if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH
                                && y > halfH - IMAGE_HALFWIDTH
                                && y < halfH + IMAGE_HALFWIDTH) {
                            //該位置用於存放圖片信息
                            //記錄圖片每個像素信息
                            pixels[y * width + x] = mBitmap.getPixel(x - halfW
                                    + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);
                        } else {
                            if (bitMatrix.get(x, y)) {
                                pixels[y * size + x] = 0xff000000;
                            } else {
                                pixels[y * size + x] = 0xffffffff;
                            }
                        }
                    }
                }
                Bitmap bitmap = Bitmap.createBitmap(size, size,
                        Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
}

Uri_Utlis

package wlt.com.hyjj;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;
import java.util.Hashtable;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;


public class Uri_Utlis  extends Activity {
    private Button btn;
    private TextView textView;

    private String photo_path;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xiangcetuo);

        btn=(Button)this.findViewById(R.id.xiangcestuo);
        textView=(TextView)this.findViewById(R.id.tvjgtuo);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
                startActivityForResult(intent, 101);
            }
        });
    }

    Handler handler=new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage( Message msg) {

            if (msg.what==1){
                String str=(String)msg.obj;
                textView.setText("識別結果爲"+str);
            }if (msg.what==2){
                String str=(String)msg.obj;
                textView.setText("識別結果爲"+str);
            }

            return true;
        }
    });
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
            System.out.print("===========onActivityResult===========");
        if (requestCode==101){
            System.out.print("===========101===========");
            Uri uri = data.getData();
            System.out.println(uri.getPath());
            ContentResolver cr = this.getContentResolver();

          try {
                Bitmap  bmp = MediaStore.Images.Media.getBitmap(cr,uri);
             final Drawable drawable =new BitmapDrawable(bmp);
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                     String result= getStringFromQRCode(drawable);
                      System.out.print("===========result==========="+result);
                      if (result != null) {
                          Message m = handler.obtainMessage();
                          m.what = 1;
                          m.obj =result;
                          handler.sendMessage(m);
                      } else {
                          Message m = handler.obtainMessage();
                          m.what = 2;
                          m.obj = "很遺憾!@!!@";
                          handler.sendMessage(m);
                      }

                  }
              }).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    /**
     * 解析
     * @return
     */
    public static String getStringFromQRCode(Drawable drawable) {
        String httpString = null;
        Bitmap bmp = drawableToBitmap(drawable);
        byte[] data =getYUV420sp(bmp.getWidth(), bmp.getHeight(), bmp);
        // 處理
        try {
            Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
           hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data,
                    bmp.getWidth(),
                    bmp.getHeight(),
                    0, 0,
                    bmp.getWidth(),
                    bmp.getHeight(),
                    false);
            BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader2= new QRCodeReader();
            Result result = reader2.decode(bitmap1, hints);

            httpString = result.getText();
        } catch (Exception e) {
            e.printStackTrace();
        }

        bmp.recycle();
        bmp = null;
        return httpString;
    }

    /**
     * @param drawable
     * @return
     */
    public static Bitmap drawableToBitmap(Drawable drawable) {
        // 取 drawable 的長寬
        int w = drawable.getIntrinsicWidth();
        int h = drawable.getIntrinsicHeight();

        // 取 drawable 的顏色格式
        Bitmap.Config config = Bitmap.Config.ARGB_8888;
        // 建立對應 bitmap
        Bitmap bitmap = Bitmap.createBitmap(w, h, config);
        // 建立對應 bitmap 的畫布
        Canvas canvas = new Canvas(bitmap);
        // 白色底色   應對透明圖
        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        canvas.drawRect(0, 0, w, h, paint);
        drawable.setBounds(0, 0, w, h);
        // 把 drawable 內容畫到畫布中
        drawable.draw(canvas);
        return bitmap;

    }


    public static byte[] getYUV420sp(int inputWidth, int inputHeight,
                                     Bitmap scaled) {
        int[] argb = new int[inputWidth * inputHeight];

        scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight);

        byte[] yuv = new byte[inputWidth * inputHeight * 3 / 2];

        encodeYUV420SP(yuv, argb, inputWidth, inputHeight);

        scaled.recycle();

        return yuv;
    }
    private static void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width,
                                       int height) {
        // 幀圖片的像素大小
        final int frameSize = width * height;
        // ---YUV數據---
        int Y, U, V;
        // Y的index從0開始
        int yIndex = 0;
        // UV的index從frameSize開始
        int uvIndex = frameSize;

        // ---顏色數據---
//      int a, R, G, B;
        int R, G, B;
        //
        int argbIndex = 0;
        //

        // ---循環所有像素點,RGB轉YUV---
        for (int j = 0; j < height; j++) {
            for (int i = 0; i < width; i++) {

                // a is not used obviously
//              a = (argb[argbIndex] & 0xff000000) >> 24;
                R = (argb[argbIndex] & 0xff0000) >> 16;
                G = (argb[argbIndex] & 0xff00) >> 8;
                B = (argb[argbIndex] & 0xff);
                //
                argbIndex++;

                // well known RGB to YUV algorithm
                Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
                U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
                V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;

                //
                Y = Math.max(0, Math.min(Y, 255));
                U = Math.max(0, Math.min(U, 255));
                V = Math.max(0, Math.min(V, 255));

                // NV21 has a plane of Y and interleaved planes of VU each
                // sampled by a factor of 2
                // meaning for every 4 Y pixels there are 1 V and 1 U. Note the
                // sampling is every other
                // pixel AND every other scanline.
                // ---Y---
                yuv420sp[yIndex++] = (byte) Y;

                // ---UV---
//              if ((j % 2 == 0) && (i % 2 == 0)) {
//
//
//
//                  yuv420sp[uvIndex++] = (byte) V;
//
//                  yuv420sp[uvIndex++] = (byte) U;
//              }
            }
        }
    }


}

以上的 zxing_Utlis 這個類是封裝了生成帶圖片和不帶圖片的二維碼 兩個方法 Uri_Utlis activate getStringFromQRCode 這個方法是解析二維碼 關鍵 方法已經貼上 整理 這幾個方法花了很長時間 經過真機測試 沒有問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章