Android端身份证识别

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目录中。

添加必要的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

运行效果图


代码

1.初始化orc,正确的Api Key和Secret Key需要去百度根据自己包名自行配置,如果配置错误,就无法使用orc文字识别

OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
    @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<IDCardResult>() {
    @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的关注,谢谢大家!


猜你喜欢

转载自blog.csdn.net/wen_haha/article/details/80578596