最近在新项目开发的过程中,遇到一个比较有意思的问题特此记录一下。
效果图
这里直接使用相机进行扫描 以及从相册中选择
开发过程中遇到的问题
这里的离线身份证识别参考 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 重要的事情说三遍!!!