美文网首页
Android二维码多码识别,相册选择二维码,自定义扫码界面

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

作者: Sarah_Y | 来源:发表于2021-08-31 17:00 被阅读0次

    现在很多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);
            }
        }
    

    相关文章

      网友评论

          本文标题:Android二维码多码识别,相册选择二维码,自定义扫码界面

          本文链接:https://www.haomeiwen.com/subject/hovziltx.html