二维码的扫描和生成

 效果图:

 一:当点击“扫描”,打开二维码扫描窗口,将扫描的二维码依字符串的形式展示。
 二:输入任意字符串,点击“生成”,在下方生成二维码。

     导入依赖:
    implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.4'
     权限:
<uses-permission android:name="android.permission.CAMERA" /
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /
   values下新建 dimens.xml:(生成的二维码大小)


   <?xml version="1.0" encoding="utf-8"?>
<resources
    <dimen name="qr_code_size">200dp</dimen>
</resources

  activity_main.xml:


   <?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/sao"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="扫描"
        android:layout_marginTop="15dp"
        />

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入..."
        android:layout_marginTop="15dp"
        />
    <Button
        android:id="@+id/sheng"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="生成"
        android:layout_marginTop="15dp"
        />

    <ImageView
        android:id="@+id/image"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:layout_marginTop="15dp"
        />
</LinearLayout>

MainActivity:

    

package com.example.rikao06;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.lang.ref.WeakReference;

import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder;

/**
 * @author lenovo
 * 二维码的生成及扫描
 */
public class MainActivity extends AppCompatActivity {
            Button sao,sheng;
            EditText edit;
            ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sao=findViewById(R.id.sao);
        sheng=findViewById(R.id.sheng);
        edit=findViewById(R.id.edit);
        imageView=findViewById(R.id.image);
        //扫描按钮点击事件
        sao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkPermiss();
            }
        });

        //生成按钮的点击事件
        sheng.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createQRCode();
            }
        });
    }

    /**
     * 扫描二维码步骤:
     *   判断系统版本是否为6.0以上、
     *   是6.0以上看有没有相机权限、
     *   没有则申请权限
     *
     */
    private void checkPermiss() {
            // 第一步: 判断系统版本号是否>=6.0--是的话要加照相机权限              
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            //第二步:判断有没有加找相机的权限,没有则加上
               //编译程序              权限         上下文     照相机的权限    
            if (ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)
                        //权限是否被授予         授予
                    !=PackageManager.PERMISSION_GRANTED){
                    //Compat:兼容              
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},100);

            }else {
                Intent intent = new Intent(MainActivity.this,SaoActivity.class);
                startActivity(intent);
            }
        }

    }
  
    @Override     //接受权限请求结果                                    请求的权限数组                    返回的结果数组            
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                              //grant:准许     权限申请通过
        if (requestCode==100&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
            Intent intent = new Intent(MainActivity.this, SaoActivity.class);
            startActivity(intent);
        }
    }

    /**
     *  生成二维码:
         因为产生二维码是耗时操作,所以在子线程中操作
     */
    private void createQRCode() {
        QRtask qRtask = new QRtask(this, imageView, edit);
        qRtask.execute(edit.getText().toString());
    }


    /**
     * 生成二维码:
          需要参数:输入的任意字符串、
          产生的BitMap图片对象大小(二维码的大小)
     */
    static class QRtask extends AsyncTask<String,Void,Bitmap>{
        //弱引用
        private WeakReference<Context> mCon;
        private WeakReference<ImageView> mImage;

        public QRtask(Context context,ImageView imageView,EditText editText){
            mCon=new WeakReference <>(context);
            mImage=new WeakReference <>(imageView);
        }
        @Override
        protected Bitmap doInBackground(String... strings) {
            String str=strings[0];
            //如果str为null
            if (TextUtils.isEmpty(str)){
                return null;
            }
            int size = mCon.get().getResources().getDimensionPixelOffset(R.dimen.qr_code_size);
                //创建二维码代码--返回BitMap类---可把它放在页面ImageView中显示
                //str:任意字符串   size:产生的BitMap图片对象大小
                return QRCodeEncoder.syncEncodeQRCode(str,size);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (bitmap!=null){
                mImage.get().setImageBitmap(bitmap);
            }else {
                Toast.makeText(mCon.get(),"生成失效",Toast.LENGTH_LONG).show();
            }
        }
    }
}
 

扫描二维码xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ScanActivity">
    <cn.bingoogolapple.qrcode.zxing.ZXingView
        android:id="@+id/zxingview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>
 

扫描二维码SaoActivity:

package com.example.rikao06;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import cn.bingoogolapple.qrcode.core.QRCodeView;
import cn.bingoogolapple.qrcode.zxing.ZXingView;
        //**********************扫码*********************************
public class SaoActivity extends AppCompatActivity implements QRCodeView.Delegate {

    private ZXingView mZXingView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan);
        mZXingView = findViewById(R.id.zxingview);
        mZXingView.setDelegate(this);
    }

    @Override        //获焦
    protected void onResume() {
        super.onResume();
        //打开后置摄像头开始预览,但是并未开始识别
        mZXingView.startCamera();
        //显示扫描框,并且延迟0.1秒后开始识别
        mZXingView.startSpotAndShowRect();
    }

    @Override        //停止
    protected void onStop() {
        super.onStop();
        //关闭摄像头预览,并且隐藏扫描框
        mZXingView.stopCamera();
    }

    @Override        //销毁
    protected void onDestroy() {
        super.onDestroy();
        mZXingView.onDestroy();
        Toast.makeText(SaoActivity.this,11+"",Toast.LENGTH_SHORT).show();
    }
    
    // 处理扫描结果
    @Override    
 //@param result 摄像头扫码时只要回调了该方法 result 就一定有值,不会为 null。解析本地图片或 Bitmap 时 result 可能为 null 
    public void onScanQRCodeSuccess(String result) {
        if(result!=null){
            Intent intent=new Intent(SaoActivity.this,ContentActivity.class);
            intent.putExtra("result",result);
            startActivity(intent);
        }
        Toast.makeText(SaoActivity.this,result,Toast.LENGTH_SHORT).show();
    }

    @Override    //摄像头环境亮度发生变化
                                         // @param isDark 是否变暗
    public void onCameraAmbientBrightnessChanged(boolean isDark) {

    }

    @Override    //处理打开相机出错
    public void onScanQRCodeOpenCameraError() {

    }
}

扫描后的结果:

package com.example.rikao06;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class ContentActivity extends AppCompatActivity {

    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content);
        textView=findViewById(R.id.text);
        Intent intent=getIntent();
        textView.setText(intent.getStringExtra("result"));
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43258668/article/details/84843328
今日推荐