Commit 7a6599b8 authored by yinjiacheng's avatar yinjiacheng

add 身份证FaceID采集逻辑

parent 3d37545f
......@@ -20,6 +20,8 @@ object Constant {
// 调用系统相机、打开系统相册 requestCode
const val REQUEST_CODE_OPEN_ALBUM = 101
const val REQUEST_CODE_OPEN_CAMERA = 102
// 调用旷视FaceID进行身份证采集 requestCode
const val REQUEST_CODE_ID_CARD_CAPTURE = 103
// 身份证人像面、身份证国徽面、营业执照待上传临时存储path,营业执照相机拍照临时存储path
const val FILE_PATH_ID_CARD_PORTRAIT_FACE = "/ocr/id_card/portrait_face.jpg"
......@@ -27,7 +29,7 @@ object Constant {
const val FILE_PATH_BUSINESS_LICENSE_CAMERA = "/ocr/business_license_camera.jpg"
const val FILE_PATH_BUSINESS_LICENSE = "/ocr/business_license.jpg"
// 上传身份证人像面、身份证国徽面标识
const val OPCODE_ID_CARD_PORTRAIT_FACE = 0
const val OPCODE_ID_CARD_NATIONAL_EMBLEM_FACE = 1
// 身份证人像面、身份证国徽面标识
const val ID_CARD_PORTRAIT_FACE = 1
const val ID_CARD_NATIONAL_EMBLEM_FACE = 2
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.yidian.shenghuoquan.newscontent.ui.auth
import android.app.Activity
import android.content.ContentResolver
import android.content.Intent
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Bundle
......@@ -12,6 +13,10 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.megvii.demo.activity.IDCardDetectActivity
import com.megvii.demo.utils.Configuration
import com.megvii.idcardquality.IDCardQualityLicenseManager
import com.megvii.licensemanager.Manager
import com.yidian.common.base.BaseFragment
import com.yidian.common.utils.YdFileUtils
import com.yidian.shenghuoquan.newscontent.R
......@@ -25,6 +30,7 @@ import com.yidian.shenghuoquan.newscontent.http.httpbean.IGetIDCardOCRCallback
import com.yidian.shenghuoquan.newscontent.ui.dialog.BottomSelectDialog
import com.yidian.shenghuoquan.newscontent.utils.BitmapUtil
import com.yidian.shenghuoquan.newscontent.utils.KS3Core
import com.yidian.utils.ToastUtil
import java.io.File
import java.io.FileOutputStream
......@@ -36,17 +42,15 @@ import java.io.FileOutputStream
class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuthBinding>(),
View.OnClickListener, BottomSelectAdapter.OnItemClickListener<BottomSelectBean> {
override fun createViewBinding(
inflater: LayoutInflater,
container: ViewGroup?
): FragmentLifeAccountIdCardAuthBinding {
return FragmentLifeAccountIdCardAuthBinding.inflate(layoutInflater, container, false)
companion object {
// 身份证采集页面回传数据
private const val EXTRA_NAME_ID_CARD_IMAGE = "idcardimg_bitmap"
}
/**
* 标识用户当前上传的是身份证人像面或身份证国徽面 帮助onActivityResult区分
*/
private var curOpCode: Int = -1
private var curFace: Int = -1
/**
* 缓存身份证两面上传金山云的objectKey
......@@ -59,10 +63,18 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
*/
private val commonPath by lazy { activity?.externalCacheDir?.absolutePath }
override fun createViewBinding(
inflater: LayoutInflater,
container: ViewGroup?
): FragmentLifeAccountIdCardAuthBinding {
return FragmentLifeAccountIdCardAuthBinding.inflate(layoutInflater, container, false)
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
initView()
initListener()
initFaceID()
}
private fun initView() {
......@@ -75,11 +87,46 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
viewBinding.ivFaceAuthStart.setOnClickListener(this)
}
/**
* 初始化旷视FaceID
*/
private fun initFaceID() {
// 竖屏采集
Configuration.setIsVertical(activity, true)
checkFaceIDLicense()
}
/**
* 检查旷视FaceID授权有效
*/
private fun checkFaceIDLicense(): Boolean {
val licenseManager = IDCardQualityLicenseManager(activity)
if (licenseManager.checkCachedLicense() > 0) {
//已授权或者授权未过期
Log.i(Constant.LIFE_ACCOUNT_AUTH_TAG, "FaceID 授权有效")
return true
} else {
//需要重新授权
Log.i(Constant.LIFE_ACCOUNT_AUTH_TAG, "FaceID 授权无效,开始获取授权")
Thread {
val manager = Manager(activity, true)
manager.registerLicenseManager(licenseManager)
manager.takeLicenseFromNetwork(
licenseManager.getContext(
Configuration.getUUID(activity)
)
)
}.start()
}
return false
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.iv_id_card_portrait_face -> {
// 上传身份证人像面
curOpCode = Constant.OPCODE_ID_CARD_PORTRAIT_FACE
curFace = Constant.ID_CARD_PORTRAIT_FACE
Configuration.setCardType(activity, Constant.ID_CARD_PORTRAIT_FACE)
activity?.let {
BottomSelectDialog(
it,
......@@ -93,7 +140,8 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
}
R.id.iv_id_card_national_emblem_face -> {
// 上传身份证国徽面
curOpCode = Constant.OPCODE_ID_CARD_NATIONAL_EMBLEM_FACE
curFace = Constant.ID_CARD_NATIONAL_EMBLEM_FACE
Configuration.setCardType(activity, Constant.ID_CARD_NATIONAL_EMBLEM_FACE)
activity?.let {
BottomSelectDialog(
it,
......@@ -114,8 +162,15 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
override fun onItemClick(view: View, position: Int, data: BottomSelectBean) {
when (data.item) {
Constant.ITEM_TAKE_PHOTO -> {
// TODO: 5/30/21 调用旷视进行身份证采集
// 调用FaceID进行身份证采集
if (checkFaceIDLicense()) {
startActivityForResult(
Intent(activity, IDCardDetectActivity::class.java),
Constant.REQUEST_CODE_ID_CARD_CAPTURE
)
} else {
ToastUtil.showToast(activity, "获取授权失败,请稍后重试")
}
}
Constant.ITEM_OPEN_ALBUM -> {
// 打开系统相册
......@@ -135,7 +190,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
Constant.REQUEST_CODE_OPEN_ALBUM -> {
if (curOpCode == Constant.OPCODE_ID_CARD_PORTRAIT_FACE) {
if (curFace == Constant.ID_CARD_PORTRAIT_FACE) {
val bitmap = BitmapUtil.generateBitmapFromUri(
activity,
data?.data,
......@@ -143,8 +198,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
)
viewBinding.ivIdCardPortraitFace.setImageBitmap(bitmap)
BitmapUtil.generateFileFromBitmap(
bitmap,
commonPath + Constant.FILE_PATH_ID_CARD_PORTRAIT_FACE
bitmap, 15, commonPath + Constant.FILE_PATH_ID_CARD_PORTRAIT_FACE
)
} else {
val bitmap = BitmapUtil.generateBitmapFromUri(
......@@ -153,8 +207,44 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
viewBinding.ivIdCardNationalEmblemFace
)
viewBinding.ivIdCardNationalEmblemFace.setImageBitmap(bitmap)
BitmapUtil.generateFileFromBitmap(
bitmap, 15, commonPath + Constant.FILE_PATH_ID_CARD_NATIONAL_EMBLEM_FACE
)
}
if (File(commonPath + Constant.FILE_PATH_ID_CARD_PORTRAIT_FACE).exists() && File(
commonPath + Constant.FILE_PATH_ID_CARD_NATIONAL_EMBLEM_FACE
).exists()
) {
// 身份证两面都已选择 执行上传金山云
startUpload()
}
}
Constant.REQUEST_CODE_ID_CARD_CAPTURE -> {
val bytes = data?.getByteArrayExtra(EXTRA_NAME_ID_CARD_IMAGE)
if (curFace == Constant.ID_CARD_PORTRAIT_FACE) {
val bitmap = bytes?.size?.let {
BitmapFactory.decodeByteArray(
bytes, 0,
it
)
}
viewBinding.ivIdCardPortraitFace.setImageBitmap(bitmap)
BitmapUtil.generateFileFromBitmap(
bitmap,
100,
commonPath + Constant.FILE_PATH_ID_CARD_PORTRAIT_FACE
)
} else {
val bitmap = bytes?.size?.let {
BitmapFactory.decodeByteArray(
bytes, 0,
it
)
}
viewBinding.ivIdCardNationalEmblemFace.setImageBitmap(bitmap)
BitmapUtil.generateFileFromBitmap(
bitmap,
100,
commonPath + Constant.FILE_PATH_ID_CARD_NATIONAL_EMBLEM_FACE
)
}
......
......@@ -5,6 +5,7 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.view.View
import java.io.File
import java.io.FileOutputStream
/**
......@@ -46,9 +47,14 @@ object BitmapUtil {
/**
* Bitmap to File
* @param quality 压缩质量
* @param destPath 目标文件路径
*/
fun generateFileFromBitmap(bitmap: Bitmap?, destPath: String) {
bitmap?.compress(Bitmap.CompressFormat.JPEG, 15, FileOutputStream(destPath))
fun generateFileFromBitmap(bitmap: Bitmap?, quality: Int, destPath: String) {
val file = File(destPath)
if (file.exists()) file.delete()
file.parentFile?.mkdirs()
file.createNewFile()
bitmap?.compress(Bitmap.CompressFormat.JPEG, quality, FileOutputStream(destPath))
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment