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.bt).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");
}
}