Android端身份证拍照识别
因为最近在做身份证识别的项目,用的是百度OCR文字识别,现在分享一下,希望可以帮助到大家。
支持的系统和硬件版本
系统:支持 Android 4.0(API Level 15)到Android7.0(API Level 25)系统。需要开发者通过minSdkVersion来保证支持系统的检测。
CPU架构:armeabi,arm64-v8a,armeabi-v7a,x86
机型:手机和平板皆可
硬件要求:要求设备上有相机模块。
网络:支持WIFI及移动网络,移动网络支持使用NET网关及WAP网关(CMWAP、CTWAP、UNIWAP、3GWAP)。
集成SDK
1.前往百度开发平台文字识别SDK下载页面下载Android SDK压缩包。
2.(必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
3.(必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程src/main/jniLibs目录中。
添加必要的权限
运行效果图
代码
1.初始化orc,正确的Api Key和Secret Key需要去百度根据自己包名自行配置,如果配置错误,就无法使用orc文字识别
OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener() { @Override public void onResult(AccessToken accessToken) { Log.d("MainActivity", "onResult: " + accessToken.toString()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "初始化认证成功", Toast.LENGTH_SHORT).show(); } }); } @Override public void onError(OCRError ocrError) { ocrError.printStackTrace(); Log.e("MainActivity", "onError: " + ocrError.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "初始化认证失败,请检查 key", Toast.LENGTH_SHORT).show(); } }); } }, getApplicationContext(), // 根据自己的包名,去百度云自行配置 "avXvTAghUgiG4k7k3jeB3vds", // 根据自己的包名,去百度云自行配置 "2yRmOb3x0cp5e1mdHaRKnIKx9qng3hpO");
2.调用拍摄的activity,OCR-UI模块提供了一套默认的UI,可以直接导入使用。
findViewById(R.id.idcardheadbutton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, CameraActivity.class); intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, DataFileUtil.getSaveFile(getApplication()).getAbsolutePath()); intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT); startActivityForResult(intent, REQUEST_CODE_CAMERA); } });
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) { if (data != null) { String contentType = data.getStringExtra(CameraActivity.KEY_CONTENT_TYPE); String filePath = DataFileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(); if (!TextUtils.isEmpty(contentType)) { if (CameraActivity.CONTENT_TYPE_ID_CARD_FRONT.equals(contentType)) { // 身份证头像面信息 Intent intent = new Intent(MainActivity.this, DetailActivity.class); intent.putExtra("cardtype", IDCardParams.ID_CARD_SIDE_FRONT); intent.putExtra("cardimage",filePath); startActivity(intent); } } } } }
3.识别身份证信息
IDCardParams param = new IDCardParams(); param.setImageFile(new File(filePath)); // 设置身份证正反面 param.setIdCardSide(idCardSide); // 设置方向检测 param.setDetectDirection(true); // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20 param.setImageQuality(40); OCR.getInstance().recognizeIDCard(param, new OnResultListener() { @Override public void onResult(IDCardResult idCardResult) { Log.i("charge ID card", String.valueOf(idCardResult)); if (idCardResult != null) { if (idCardSide.equals("back")) { String signDate = ""; String expiryDate = ""; String issueAuthority = ""; if (idCardResult.getSignDate() != null) { signDate = idCardResult.getSignDate().toString(); } if (idCardResult.getExpiryDate() != null) { expiryDate = idCardResult.getExpiryDate().toString(); } if (idCardResult.getIssueAuthority() != null) { issueAuthority = idCardResult.getIssueAuthority().toString(); } mContent.setText("签发机关: " + issueAuthority + "\n\n" + "有效期限: " + signDate + "-" + expiryDate + "\n\n"); }else { String name = ""; String sex = ""; String nation = ""; String num = ""; String address = ""; if (idCardResult.getName() != null) { name = idCardResult.getName().toString(); } if (idCardResult.getGender() != null) { sex = idCardResult.getGender().toString(); } if (idCardResult.getEthnic() != null) { nation = idCardResult.getEthnic().toString(); } if (idCardResult.getIdNumber() != null) { num = idCardResult.getIdNumber().toString(); } if (idCardResult.getAddress() != null) { address = idCardResult.getAddress().toString(); } mContent.setText("姓名: " + name + "\n\n" + "性别: " + sex + "\n\n" + "民族: " + nation + "\n\n" + "身份证号码: " + num + "\n\n" + "住址: " + address + "\n\n"); } }
总结
只有身份证正面的识别,反面识别的代码被我去掉了,如果需要,可以联系我。
DEMO
https://download.csdn.net/download/wen_haha/10447864
GitHub
https://github.com/kongkongdaren/SfzDemo
希望大家点一波github的关注,谢谢大家!