身份证接口调用流程

当把SDK集成到开发环境之后,您还需要设置相关参数等操作。身份证扫描参数与银行卡扫描参数有所不同。您需要根据您的需求,选择对应的参数设置方法。

当您需要扫描银行卡时,请参考银行卡接口调用流程

1.选定扫描界面,设置参数

使用OCR SDK扫描身份证前,您需要设置相关的参数,具体操作如下:

身份证扫描场景有4种模式可供选择,分别是:扫描正面扫描反面连续扫描正反面快速扫描姓名和号码。您可以选择您所需要的模式,具体操作请参考代码。

扫描正面

/*识别身份证正面*/
    Intent scanIntent = new Intent(this, IDCardActivity.class);
    scanIntent.putExtra(IDCardActivity.EXTRA_BACK_DRAWABLE_ID, R.mipmap.icon_scan_back);
    //设置身份证扫描类型
    scanIntent.putExtra(IDCardActivity.EXTRA_RECOGNIZE_MODE, IDCardRecognizer.Mode.FRONT);
    //设置身份证扫描文字
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TIPS,"请将身份证正面放入扫描框内");
    //标题栏标题
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TITLE, "请扫描身份证");
    // 设置扫描界面方向为竖直,设备头部朝上
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_ORIENTATION, IDCardActivity.ORIENTATION_PORTRAIT);
    // 设置需要返回裁剪后的身份证图像
    scanIntent.putExtra(IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED, true);
    // 设置需要返回原图
    scanIntent.putExtra(IDCardActivity.EXTRA_CARD_IMAGE, true);
    //扫描取景框边界颜色
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_GUIDE_COLOR, Color.parseColor("#78FFFFFF"));
    //是否需要在框内才能扫描,默认true
       scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_IS_IN_FRAME, true);
    //设置扫描的超时时间,单位秒
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TIME_OUT, 30);
    //设置是否开启自动对焦,默认不开启
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_AUTO_FOCUS, false);
    //设置是否开启扫描光标
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_LINE_STATUS, true);

扫描反面

/*识别身份证反面*/
    Intent scanIntent = new Intent(this, IDCardActivity.class);
    scanIntent.putExtra(IDCardActivity.EXTRA_BACK_DRAWABLE_ID, R.mipmap.icon_scan_back);
    //设置身份证扫描类型
    scanIntent.putExtra(IDCardActivity.EXTRA_RECOGNIZE_MODE, IDCardRecognizer.Mode.BACK);
    //设置身份证扫描文字
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TIPS,"请将身份证反面放入扫描框内");
    //标题栏标题
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TITLE, "请扫描身份证");
    // 设置扫描界面方向为竖直,设备头部朝上
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_ORIENTATION, IDCardActivity.ORIENTATION_PORTRAIT);
    // 设置需要返回裁剪后的身份证图像
    scanIntent.putExtra(IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED, true);
    // 设置需要返回原图
    scanIntent.putExtra(IDCardActivity.EXTRA_CARD_IMAGE, true);
    //扫描取景框边界颜色
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_GUIDE_COLOR, Color.parseColor("#78FFFFFF"));
    //是否需要在框内才能扫描,默认true
       scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_IS_IN_FRAME, true);
    //设置扫描的超时时间,单位秒
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TIME_OUT, 30);
    //设置是否开启自动对焦,默认不开启
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_AUTO_FOCUS, false);
    //设置是否开启扫描光标
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_LINE_STATUS, true);

连续扫描正反面

/*连续扫描正反面模式*/
    Intent scanIntent = new Intent(this, IDCardBothActivity.class);
    scanIntent.putExtra(IDCardBothActivity.EXTRA_BACK_DRAWABLE_ID, R.mipmap.icon_scan_back);
    //设置身份证扫描类型
    scanIntent.putExtra(IDCardBothActivity.EXTRA_RECOGNIZE_MODE, IDCardRecognizer.Mode.FRONT);
    //设置身份证扫描文字
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_TIPS,"请将身份证正面放入扫描框内");
    //标题栏标题
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_TITLE, "请扫描身份证");
    // 设置扫描界面方向为竖直,设备头部朝上
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_ORIENTATION, IDCardBothActivity.ORIENTATION_PORTRAIT);
    // 设置需要返回身份证正面裁剪后的身份证图像
    scanIntent.putExtra(IDCardBothActivity.KEY_FRONT_CROP_BITMAP, true);
    // 设置需要返回身份证正面取景框的身份证图像 
    scanIntent.putExtra(IDCardBothActivity.KEY_FRONT_CAMERA_APERTURE_BITMAP, true);
    // 设置需要返回身份证反面裁剪后的身份证图像
    scanIntent.putExtra(IDCardBothActivity.KEY_BACK_CROP_BITMAP, true);
    // 设置需要返回身份证反面取景框的身份证图像
    scanIntent.putExtra(IDCardBothActivity.KEY_BACK_CAMERA_APERTURE_BITMAP, true);
    //设置是否开启扫描光标
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_LINE_STATUS, LFSpUtils.getIsShowScanCursor(this));
    //扫描取景框边界颜色
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_GUIDE_COLOR, Color.parseColor("#78FFFFFF"));

    //是否需要在框内才能扫描,默认true
       scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_IS_IN_FRAME, true);
    //设置扫描的超时时间,单位秒
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_TIME_OUT, 30);
    //设置是否开启自动对焦,默认不开启
    scanIntent.putExtra(IDCardBothActivity.EXTRA_SCAN_AUTO_FOCUS, false);

快速扫描姓名和号码

/*快速扫描姓名和身份证号*/
    Intent scanIntent = new Intent(this, IDCardActivity.class);
    scanIntent.putExtra(IDCardActivity.EXTRA_BACK_DRAWABLE_ID, R.mipmap.icon_scan_back);
    // 设置只需要识别身份证号和姓名
    scanIdCardIntent.putExtra(IDCardActivity.EXTRA_RECOGNIZE_FLAG, IDCardRecognizer.RECOGNIZE_FLAG_ID | IDCardRecognizer.RECOGNIZE_FLAG_NAME);
    //设置身份证扫描类型
    scanIntent.putExtra(IDCardActivity.EXTRA_RECOGNIZE_MODE, IDCardRecognizer.Mode.FRONT);
    //设置身份证扫描文字
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TIPS,"请将身份证正面放入扫描框内");
    //标题栏标题
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TITLE, "请扫描身份证");
    // 设置扫描界面方向为竖直,设备头部朝上
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_ORIENTATION, IDCardActivity.ORIENTATION_PORTRAIT);
    // 设置需要返回裁剪后的身份证图像
    scanIntent.putExtra(IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED, true);
    // 设置需要返回原图
    scanIntent.putExtra(IDCardActivity.EXTRA_CARD_IMAGE, true);
    //扫描取景框边界颜色
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_GUIDE_COLOR, Color.parseColor("#78FFFFFF"));
    //是否需要在框内才能扫描,默认true
       scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_IS_IN_FRAME, true);
    //设置扫描的超时时间,单位秒
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_TIME_OUT, 30);
    //设置是否开启自动对焦,默认不开启
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_AUTO_FOCUS, false);
    //设置是否开启扫描光标
    scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_LINE_STATUS, LFSpUtils.getIsShowScanCursor(this));

自定义界面

/*自定义界面*/
    Intent scanIntent = new Intent(this, MyIDCardActivity.class);
    scanIntent.putExtra(MyIDCardActivity.EXTRA_BACK_DRAWABLE_ID, R.mipmap.icon_scan_back);
    //设置身份证扫描类型
    scanIntent.putExtra(MyIDCardActivity.EXTRA_RECOGNIZE_MODE, IDCardRecognizer.Mode.FRONT);
    //设置身份证扫描文字
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_TIPS,"请将身份证正面放入扫描框内");
    //标题栏标题
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_TITLE, "自定义界面");
    // 设置扫描界面方向为竖直,设备头部朝上
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_ORIENTATION,     IDCardBothActivity.ORIENTATION_PORTRAIT);
    // 设置需要返回身份证正面裁剪后的身份证图像
    scanIntent.putExtra(MyIDCardActivity.KEY_FRONT_CROP_BITMAP, true);
    // 设置需要返回身份证正面取景框的身份证图像
    scanIntent.putExtra(MyIDCardActivity.KEY_FRONT_CAMERA_APERTURE_BITMAP, true);
    // 设置需要返回身份证反面裁剪后的身份证图像
    scanIntent.putExtra(MyIDCardActivity.KEY_BACK_CROP_BITMAP, true);
    // 设置需要返回身份证反面取景框的身份证图像
    scanIntent.putExtra(MyIDCardActivity.KEY_BACK_CAMERA_APERTURE_BITMAP, true);
    //设置是否开启扫描光标
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_LINE_STATUS, true);
    //扫描取景框边界颜色
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_GUIDE_COLOR, Color.parseColor("#78FFFFFF"));
    //是否整卡扫描,默认true
       scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_IS_IN_FRAME, true);
    //设置扫描的超时时间,单位秒
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_TIME_OUT, 30);
    //设置是否开启自动对焦,默认不开启
    scanIntent.putExtra(MyIDCardActivity.EXTRA_SCAN_AUTO_FOCUS, false);

竖屏扫描框位置微调

/**竖屏模式下支持扫描框位置微调
 * *通过设置参数IDCardActivity.EXTRA_SCAN_RECT_OFFSET(int)微调位置
 * *阈值为-75到75;+75表示向上移动的最大值,-75表示向下移动的最大值
**/
scanIntent.putExtra(IDCardActivity.EXTRA_SCAN_RECT_OFFSET, scanRectOffset);

2.启动扫描界面

//启动扫描界面
startActivityForResult(scanIntent, EXAMPLE_REQUEST_CODE);

此处EXAMPLE_REQUEST_CODE的取值如下:
扫描正面:LFMainActivity.LF_SCAN_ID_CARD_FRONT_REQUEST,值为100
扫描反面:LFMainActivity.LF_SCAN_ID_CARD_BACK_REQUEST,值为101
连续扫描正反面:LFMainActivity.LF_SCAN_ID_CARD_BOTH_REQUEST,值为102
快速扫描姓名和号码:LFMainActivity.LF_SCAN_ID_CARD_FRONT_QUICK_REQUEST,值为103
自定义界面:LFMainActivity.LF_SCAN_ID_CARD_CUSTOM_REQUEST,值为104

3.返回码处理

//扫描成功。可按"4.获取数据"部分处理结果
case IDCardActivity.RESULT_CARD_INFO

//相机授权失败。请在设置中打开相机权限或动态请求相机权限
case IDCardActivity.RESULT_CAMERA_NOT_AVAILABLE

//扫描取消。
case Activity.RESULT_CANCELED

//识别模型初始化失败。可以根据data中的“error_code”、“error_msg”错误信息做相应的处理
case IDCardActivity.RESULT_RECOGNIZER_INIT_FAILED

//扫描超时。超时自动退出了扫描界面
case BankCardActivity.RESULT_RECOGNIZER_FAIL_SCAN_TIME_OUT:

//License路径未初始化。License路径未初始化
case BankCardActivity.RESULT_NOT_INIT_LIC_PATH_ERROR

以上“识别模型初始化失败”的error_code类别如下:
LFCommon.CV_E_FILE_NOT_FOUND //模型未找到,加载失败
LFCommon.CV_E_INVALID_APPID //包名错误
LFCommon.CV_E_AUTH_EXPIRE //License过期
LFCommon.CUS_SET_CONFIG_ERROR //设置模型Config信息失败

4. 获取数据

离线版可直接获取到数据,如下

获取身份证正面结果:

private Object getReturnResult(String key) {
        Object data = LFIntentTransportData.getInstance().getData(key);
        LFIntentTransportData.getInstance().removeData(key);
        return data;
}

IDCard idcard =
 (IDCard) getReturnResult(IDCardActivity.EXTRA_SCAN_RESULT);
 //设置为返回裁剪图时,获取图片数据
byte[] imageBytes = 
(byte[]) getReturnResult(IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED);
//设置为返回原图时,获取图片数据
byte[] imageBytes = (byte[]) getReturnResult(IDCardActivity.EXTRA_CARD_IMAGE);

String name=idcard.getStrName();//使用idcard.getStrName()获取姓名
String sex=idcard.getStrSex();//使用idcard. getStrSex ()获取性别
String race=idcard.getStrNation();//使用idcard. getStrNation ()获取民族
String birth= idcard.getStrDate();//使用idcard. getStrDate ()获取出生日期
String address=idcard.getStrAddress();//使用idcard. getStrAddress ()获取住址
String idNumber=idcard.getStrID();//使用idcard. getStrID ()获取身份证号

//下面两个方法获取的位置相对于裁剪后的身份证图片,需设置为IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED,返回值为int型数组,

int[] imgNameRect = idcard.getImgName();//获取姓名所在身份证图片上的位置
int[] imgNumRect = idcard.getImgID();//获取身份证号所在身份证图片上的位置

//picRes必须为SDK返回的裁剪后的图片,否则裁剪位置不准确
Bitmap imgName = Bitmap.createBitmap(picRes, imgNameRect.left, imgNameRect.top, imgNameRect.right-imgNameRect.left, imgNameRect.bottom-imgNameRect.top);//裁剪出姓名小图片

//picRes必须为SDK返回的裁剪后的图片,否则裁剪位置不准确
Bitmap imgNum = Bitmap.createBitmap(picRes, imgNumRect.left, imgNumRect.top, imgNumRect.right-imgNumRect.left, imgNumRect.bottom-imgNumRect.top);//裁剪出身份证号小图片

获取身份证反面结果:

IDCard idcard =
 (IDCard) getReturnResult(IDCardActivity.EXTRA_SCAN_RESULT);
 //设置为返回裁剪图时,获取图片数据
byte[] imageBytes = 
(byte[]) getReturnResult(IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED);
//设置为返回原图时,获取图片数据
byte[] imageBytes = (byte[]) getReturnResult(IDCardActivity.EXTRA_CARD_IMAGE);

//使用idcard. getStrAuthority ()获取签发机关
String issuingAuthority=idcard. getStrAuthority ();

//使用idcard. getStrValidity ()获取有限期限
String expirationDate=idcard. getStrValidity ();

获取快速扫描姓名和号码结果:

IDCard idcard =
 (IDCard) getReturnResult(IDCardActivity.EXTRA_SCAN_RESULT);
 //设置为返回裁剪图时,获取图片数据
byte[] imageBytes = 
(byte[]) getReturnResult(IDCardActivity.EXTRA_CARD_IMAGE_RECTIFIED);

//设置为返回原图时,获取图片数据
byte[] imageBytes = (byte[]) getReturnResult(IDCardActivity.EXTRA_CARD_IMAGE);

String name=idcard.getStrName();//使用idcard.getStrName()获取姓名
String idNumber=idcard.getStrID();//使用idcard. getStrID ()获取身份证号

//picRes必须为SDK返回的裁剪后的图片,否则裁剪位置不准确
Bitmap imgName = Bitmap.createBitmap(picRes, imgNameRect.left, imgNameRect.top, imgNameRect.right-imgNameRect.left, imgNameRect.bottom-imgNameRect.top);//裁剪出姓名小图片

//picRes必须为SDK返回的裁剪后的图片,否则裁剪位置不准确
Bitmap imgNum = Bitmap.createBitmap(picRes, imgNumRect.left, imgNumRect.top, imgNumRect.right-imgNumRect.left, imgNumRect.bottom-imgNumRect.top);//裁剪出身份证号小图片

获取连续扫描正反面的结果:

//在IDCardBothActivity中自定义的返回IDCard的方式
IDCard idCardFrontResult = (IDCard) getReturnResult(IDCardBothActivity.KEY_FRONT_CARD_DATA);
IDCard idCardBackResult = (IDCard) getReturnResult(IDCardBothActivity.KEY_BACK_CARD_DATA);
//分别获取正面和反面原图
byte[] cropFrontImage = (byte[]) getReturnResult(IDCardBothActivity.KEY_FRONT_CROP_BITMAP);
byte[] cropBackImage = (byte[]) getReturnResult(IDCardBothActivity.KEY_BACK_CROP_BITMAP);

//分别获取裁剪后的正面和反面图像
byte[] cameraApertureFrontImage = (byte[]) getReturnResult(IDCardBothActivity.KEY_FRONT_CAMERA_APERTURE_BITMAP);
byte[] cameraApertureBackImage = (byte[]) getReturnResult(IDCardBothActivity.KEY_BACK_CAMERA_APERTURE_BITMAP);
//获取正面数据(参考:获取身份证正面结果)
//获取反面数据(参考:获取身份证反面结果)

在线版获取数据

在线版获取到的是加密后的数据,需要调用解密接口解密,参考使用指南,详见4.3的步骤3。

results matching ""

    No results matching ""