实现效果:

实现步骤:

1.Gradle添加二维码包引用。

implementation 'cn.bingoogolapple:bga-qrcode-zbar:1.3.7'

添加好后,点击右上角的“Sync Now”

2.AndroidManifest.xml 增加相关权限配置。

3.测试Activity代码:page_qr.xml

<?xml version="1.0" encoding="utf-8"?>        

注意:顶部申明许加上 xmlns:app="http://schemas.android.com/apk/res-auto" 这是自定义控件需要申明的命名空间。

4.后置代码 Page_QR.java

package com.example.rc114.ui;import android.Manifest;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Vibrator;import android.provider.Settings;import android.view.View;import android.widget.TextView;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import com.example.rc114.R;import java.util.ArrayList;import java.util.List;import cn.bingoogolapple.qrcode.core.QRCodeView;import cn.bingoogolapple.qrcode.zbar.ZBarView;public class Page_QR extends AppCompatActivity {    QRCodeView qrCodeView;    String[] permissions = new String[]{            Manifest.permission.CAMERA,            Manifest.permission.VIBRATE    };    private final int permissionCode = 100;//权限请求码    //检查权限    private void checkPermission() {        List permissionList = new ArrayList<>();        for (int i = 0; i < permissions.length; i++) {            if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {                permissionList.add(permissions[i]);            }        }        if (permissionList.size() <= 0) {            //说明权限都已经通过,可以做你想做的事情去            bindEvent();        } else {            //存在未允许的权限            ActivityCompat.requestPermissions(this, permissions, permissionCode);        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        boolean haspermission = false;        if (permissionCode == requestCode) {            for (int i = 0; i < grantResults.length; i++) {                if (grantResults[i] == -1) {                    haspermission = true;                }            }            if (haspermission) {                //跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问                permissionDialog();            } else {                //全部权限通过,可以进行下一步操作                bindEvent();            }        }    }    AlertDialog alertDialog;    //打开手动设置应用权限    private void permissionDialog() {        if (alertDialog == null) {            alertDialog = new AlertDialog.Builder(this)                    .setTitle("提示信息")                    .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")                    .setPositiveButton("设置", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            cancelPermissionDialog();                            Uri packageURI = Uri.parse("package:" + getPackageName());                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);                            startActivity(intent);                        }                    })                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            cancelPermissionDialog();                        }                    })                    .create();        }        alertDialog.show();    }    private void cancelPermissionDialog() {        alertDialog.cancel();    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.page_qr);        //6.0才用动态权限        if (Build.VERSION.SDK_INT >= 23) {            checkPermission();        } else {            bindEvent();        }    }    private void bindEvent() {        qrCodeView = (ZBarView) findViewById(R.id.zbarview);        qrCodeView.setDelegate(new QRCodeView.Delegate() {            @Override            public void onScanQRCodeSuccess(String result) {                vibrate();//震动手机                //扫描成功后处理事件                Toast.makeText(Page_QR.this, result, Toast.LENGTH_SHORT).show();                qrCodeView.startSpot();//继续扫描                TextView txtText = (TextView) findViewById(R.id.txtText);                txtText.setText(result);            }            @Override            public void onCameraAmbientBrightnessChanged(boolean isDark) {                // 这里是通过修改提示文案来展示环境是否过暗的状态,接入方也可以根据 isDark 的值来实现其他交互效果                String tipText = qrCodeView.getScanBoxView().getTipText();                String ambientBrightnessTip = "\n环境过暗,请打开闪光灯";                if (isDark) {                    if (!tipText.contains(ambientBrightnessTip)) {                        qrCodeView.getScanBoxView().setTipText(tipText + ambientBrightnessTip);                    }                } else {                    if (tipText.contains(ambientBrightnessTip)) {                        tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip));                        qrCodeView.getScanBoxView().setTipText(tipText);                    }                }            }            @Override            public void onScanQRCodeOpenCameraError() {                Toast.makeText(Page_QR.this, "错误", Toast.LENGTH_SHORT).show();            }        });        qrCodeView.startCamera();        findViewById(R.id.start_spot).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                onStart();                Toast.makeText(Page_QR.this, "开始扫码", Toast.LENGTH_SHORT).show();            }        });        findViewById(R.id.stop_spot).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                onStop();                Toast.makeText(Page_QR.this, "停止扫码", Toast.LENGTH_SHORT).show();            }        });        findViewById(R.id.open_flashlight).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                qrCodeView.openFlashlight();                Toast.makeText(Page_QR.this, "打开闪光灯", Toast.LENGTH_SHORT).show();            }        });        findViewById(R.id.close_flashlight).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                qrCodeView.closeFlashlight();                Toast.makeText(Page_QR.this, "关闭闪光灯", Toast.LENGTH_SHORT).show();            }        });    }    @Override    protected void onStart() {        super.onStart();        qrCodeView.startCamera();//打开后置摄像头开始预览,但是并未开始识别        qrCodeView.startSpotAndShowRect(); // 显示扫描框,并开始识别//        mQRCodeView.showScanRect();//显示扫描框//        mQRCodeView.startSpot();//开始识别二维码        //mQRCodeView.openFlashlight();//开灯        //mQRCodeView.closeFlashlight();//关灯    }    @Override    protected void onStop() {        qrCodeView.stopCamera();// 关闭摄像头预览,并且隐藏扫描框        super.onStop();    }    @Override    protected void onDestroy() {        qrCodeView.onDestroy();        super.onDestroy();    }    private void vibrate() {        Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);        vibrator.vibrate(200);    }}

参考:https://www.jianshu.com/p/b55808410cd7

 

更多相关文章

  1. [Android]自定义移动网络接入点
  2. android自动关机代码
  3. Android(安卓)实现微信,微博,微信朋友圈,QQ分享的功能
  4. Android中AudioRecord 录音和AudioTrack播放录音,并可以转为wav格
  5. Android之permission权限列表
  6. android创建可拖动的悬浮窗,并实现点击回调
  7. Android版本更新(断点下载)
  8. android之监控各个程序的流量
  9. android superuser.apk 管理root权限原理分析

随机推荐

  1. PHP函数的使用
  2. 字符串函数与动态表格
  3. 缓存函数的简单使用
  4. 什么是线程池?
  5. Java 中 long 是不是原子操作?
  6. 小白学Python:Python的基本数据类型
  7. 实用攻略:云服务器如何选购?要考虑哪些因素
  8. 开发中总结的dart相关的技巧
  9. 简历模板练习
  10. 我的本科回忆录:从迷茫自卑到保送华科