Android二维码多码识别,相册选择二维码,自定义扫码界面

2021-08-31  本文已影响0人  Sarah_Y

现在很多App都有扫码识别二维码的场景,最新的扫码已经支持全屏扫码、从相册选取二维码识别,以下使用基于Zxing封装的一个库:https://github.com/maning0303/MNZXingCode

MNZXingCode 快速集成zxing二维码扫描
快速集成zxing二维码扫描,生成二维码,可配置相册,闪光灯,相机可以调整焦距放大缩小,自定义扫描线颜色,自定义背景颜色,自定义遮罩层,自定义Activity,多个二维码扫码(zxing:core:3.3.3/3.4.0)

1:生成二维码,支持修改颜色和边距,支持带Logo
2:二维码扫描,手势缩放,无拉伸,样式自定义
3:相册中选取图片识别
4:闪光灯开关
5: 相机可以调整焦距放大缩小
6: 完全自定义遮罩层
7: 自定义Activity
8: 支持微信,支付宝类似多个二维码扫码

gradle集成方式:

    //扫一扫支持全屏、从相册选择:需要支持7.0以下
    implementation 'com.google.zxing:core:3.3.3'
    implementation 'com.github.maning0303:MNZXingCode:V2.1.8'

具体使用:
//(1)默认扫描使用:

        MNScanManager.startScan(this, new MNScanCallback() {
            @Override
            public void onActivityResult(int resultCode, Intent data) {
                switch (resultCode) {
                    case MNScanManager.RESULT_SUCCESS:
                        String resultSuccess = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS);
                        break;
                    case MNScanManager.RESULT_FAIL:
                        String resultError = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR);
                        break;
                    case MNScanManager.RESULT_CANCLE:
                        showToast("取消扫码");
                        break;
                }
            }
        });
        // (2)自定义扫描布局和参数
        MNScanConfig scanConfig = new MNScanConfig.Builder()
                //设置完成震动
                .isShowVibrate(true)
                //扫描完成声音
                .isShowBeep(true)
                //显示相册功能
                .isShowPhotoAlbum(true)
                //显示闪光灯
                .isShowLightController(false)
                //打开扫描页面的动画
                .setActivityOpenAnime(R.anim.activate_in)
                //退出扫描页面动画
                .setActivityExitAnime(R.anim.activate_out)
                //自定义文案--不展示
                .setScanHintText("")
                //自定义文案颜色
                .setScanHintTextColor("#FFFFFF")
                //自定义文案大小(单位sp)
                .setScanHintTextSize(15)
                //是否显示缩放控制器
                .isShowZoomController(false)
                //显示缩放控制器位置
                .setZoomControllerLocation(MNScanConfig.ZoomControllerLocation.Bottom)
                //背景颜色
                .setBgColor("#33FF0000")
                //扫描线样式
                .setLaserStyle(MNScanConfig.LaserStyle.Line)
                //扫描线的颜色
                .setScanColor("#E61F55")
                //网格扫描线的列数
                .setGridScanLineColumn(30)
                //网格高度
                .setGridScanLineHeight(1)
                //高度偏移值(单位px)+向上偏移,-向下偏移
                .setScanFrameHeightOffsets(150)
                //是否全屏范围扫描
                .setFullScreenScan(true)
                //二维码标记点
                .isShowResultPoint(true)
                // 设置标记点的大小、色值
                .setResultPointConfigs(36, 20, 2, "#FFFFFFFF", "#E61F55")
                //状态栏设置:颜色,是否黑色字体
                .setStatusBarConfigs("#00000000", true)
                //是否支持多二维码同时扫出,默认false,多二维码状态不支持条形码
                .setSupportMultiQRCode(true)
                //自定义遮罩
                .setCustomShadeViewLayoutID(R.layout.layout_custom_view, new MNCustomViewBindCallback() {
                    @Override
                    public void onBindView(View customView) {
                        //TODO:通过findviewById 获取View
                        // 返回按钮,点击关闭扫描
                        ImageView ivBack = customView.findViewById(R.id.ivBack);
                        //TODO 打开相册,选择二维码
                        ImageView ivPhoto = customView.findViewById(R.id.ivPhoto);
                        tvTips = customView.findViewById(R.id.tvTips);
                        scanLine = customView.findViewById(R.id.scanLine);
                        ivBack.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                //关闭扫描页面
                                MNScanManager.closeScanPage();
                            }
                        });
                        ivPhoto.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                //打开相册扫描
                                RxPermissions.getInstance(activity).request(
                                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                        Manifest.permission.READ_EXTERNAL_STORAGE,
                                        Manifest.permission.CAMERA)
                                        .subscribe(new Observer<Boolean>() {
                                            @Override
                                            public void onCompleted() {
                                            }

                                            @Override
                                            public void onError(Throwable e) {
                                            }

                                            @Override
                                            public void onNext(Boolean aBoolean) {
                                                if (aBoolean) {
                                                    MNScanManager.openAlbumPage();
                                                } else {
                                                    Toast.makeText(activity, R.string.permission_request_denied, Toast.LENGTH_LONG)
                                                            .show();
                                                }
                                            }
                                        });
                            }
                        });
                        startScanAnimation();
                    }
                })
                .builder();

        // 开启扫描
        MNScanManager.startScan(activity, scanConfig, new MNScanCallback() {
            public void onActivityResult(int resultCode, Intent data) {
                switch (resultCode) {
                    case MNScanManager.RESULT_SUCCESS:
                        String resultSuccess = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS);
                        if (callback != null) {
                            callback.onResult(resultSuccess);
                        } else {
                            handleDecode(activity, from, resultSuccess, barcode);
                        }
                        break;
                    case MNScanManager.RESULT_FAIL:
                        // 错误提示:比如:初始化相机失败等
                        String resultError = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR);
                       
                        break;
                    case MNScanManager.RESULT_CANCLE:
                        ZZSSLog.e("取消扫码");
                        break;
                }
            }
        });

Activity中调用以上方法:

// (1)授权相机、读写权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.requestPermissions(
                    new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_CODE_OF_SCAN_PAGE);
        }
// (2)在onRequestPermissionsResult,获取授权请求结果后,启动扫码
/**
     * Callback received when a permissions request has been completed.
     */
    @Override
    public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_OF_SCAN_PAGE) {
            // 将最上面的扫描代码写在startScan()方法中,进行调用,也可以将扫描结果回调出来,随时使用。
            startScan(this);
        }
    }
上一篇下一篇

猜你喜欢

热点阅读