android离线身份证识别(从相册选择)

最近在新项目开发的过程中,遇到一个比较有意思的问题特此记录一下。

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里直接使用相机进行扫描 以及从相册中选择

开发过程中遇到的问题

这里的离线身份证识别参考 https://github.com/fanqieVip/AndroidOcrLibs
当我从github将此项目下载下来运行到我的androidstudio中时,我发现该项目只有进行相册扫描的功能,没有从相册选择的例子
在查阅了一些文档之后也有一些启发
在这里插入图片描述
下面就直接开始代码部分,如何集成离线身份证识别请参考https://github.com/fanqieVip/AndroidOcrLibs 上面有如何导入的方法,这里就不在累赘,直接开始主要代码展示:

binding.constraintLayout16.setOnClickListener {//按钮点击事件
            XPopup.Builder(requestActivity())
                .autoOpenSoftInput(false)
                .isDestroyOnDismiss(true) //对于只使用一次的弹窗,推荐设置这个
                .popupPosition(PopupPosition.Bottom)
                .asBottomList(
                    "请选择识别方式", arrayOf("扫描","从相册选择"),
                    null, object : OnSelectListener {
                        override fun onSelect(position: Int, text: String?) {
                           when(position){
                               0->{//扫描
                                   LibraryInitOCR.initOCR(requestActivity())
                                   val bundle = Bundle()
                                   bundle.putBoolean("saveImage", true)
                                   bundle.putInt("requestCode", SCAN_IDCARD_REQUEST)
                                   bundle.putInt("type", 0) //0身份证, 1驾驶证
                                   LibraryInitOCR.startScan(requestActivity(), bundle)
                               }
                               1->{//从相册选择
                                   showPhotoselect(it.id)
                               }
                           }
                        }
                    }
                )
                .show()
        }

这里最重要的就是从相册选择 showPhotoselect()的方法了

private fun showPhotoselect(id: Int) {
        PhotoPickConfig.Builder(requestActivity())
            .imageLoader(GlideImageLoader()) //图片加载方式,支持任意第三方图片加载库
            .spanCount(PhotoPickConfig.GRID_SPAN_COUNT) //相册列表每列个数,默认为3
            .pickMode(PhotoPickConfig.MODE_PICK_SINGLE) //设置照片选择模式为单选,默认为单选
            .maxPickSize(PhotoPickConfig.DEFAULT_CHOOSE_SIZE) //多选时可以选择的图片数量,默认为1张
            .setMimeType(MimeType.TYPE_IMAGE) //显示文件类型,默认全部(全部、图片、视频)
            .showCamera(true) //是否展示相机icon,默认展示
            .clipPhoto(true) //是否开启裁剪照片功能,默认关闭
            .clipCircle(false) //是否裁剪方式为圆形,默认为矩形
            .showOriginal(true) //是否显示原图按钮,默认显示
            .startCompression(true) //是否开启压缩,默认true
            .selectedMimeType(data) //选择后返回的文件(用于判断下次进入是否可展示其他类型文件)
            .setCallback(object : PhotoSelectCallback {
                override fun selectResult(photos: ArrayList<MediaData>?) {
                    if(photos!=null&&photos.size>0){
                        if(id==R.id.constraintLayout16){
                            val h: Handler = object : Handler() {
                                override fun handleMessage(var1: Message) {
                                    when (var1.what) {
                                        DECODE_SUCCESS -> {
                                            val intent = var1.obj as Intent
                                            val result = intent.getStringExtra("OCRResult")
                                            try {
                                                val jo = JSONObject(result)
                                                var imagePath = jo.opt("imgPath")
                                                if(imagePath!=null){
                                                    //TODO::这里拿到识别成功后的身份证照片本地路径 后期自己处理一下
                                                    loadImageA(imagePath.toString())
                                                }
                                                binding.fillInName.setText(jo.opt("name").toString())
                                                binding.textView78.text = jo.opt("sex").toString()
                                                binding.fillInMinzu.setText(jo.opt("folk").toString())
                                                binding.fillInSfCard.setText(jo.opt("num").toString())
                                            } catch (e: JSONException) {
                                                e.printStackTrace()
                                            }
                                        }
                                        else->{
                                            AndroidUtils.showShortToast(requestActivity(),"未识别到身份证信息!")
                                        }
                                    }
                                }
                            }
                            LibraryInitOCR.initOCR(requestActivity())//初始化
                            LibraryInitOCR.initDecode(requestActivity(),h,true)
                            //photos.get(0).clipImagePath 拿到从相册中选择的图片地址
                            val var2 = BitmapFactory.decodeFile(photos.get(0).clipImagePath)
                            val var3 = ByteArrayOutputStream()
                            var2.compress(Bitmap.CompressFormat.JPEG, 100, var3)
                            val var4 = var3.toByteArray()
                            val var5 = Rect(0, 0, var2.width, var2.height)
                           // var2.
                            LibraryInitOCR.decode(photos.get(0).clipImagePath)
                          //  LibraryInitOCR.decode(var5, var2.width, var2.height, var4)
                            return
                        }
                    }
                }
            }) //回调
            .build()
    }

额外说明

1.这里我在刚开始进行LibraryInitOCR集成的过程中,因为我引入的jar包和aar过多,导致在引入当前身份识别过程中可能有冲突,下面就把如何解决arr冲突的方法讲解一下
在这里插入图片描述
这里用androidstudio打开当前arr,无法进行重命名的操作,这时可以直接进入当前路径下先将其改为.zip然后进行文件夹名字修改,修改完成后重新改回来就可以了。

2.未初始化问题
在相册选择时,调用LibraryInitOCR.initDecode(requestActivity(),h,true)方法时提示未初始化,这里一定要记得加上LibraryInitOCR.initOCR(requestActivity())//初始化

本文项目参考 https://github.com/fanqieVip/AndroidOcrLibs 重要的事情说三遍!!!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安东尼肉店

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值