1. 程式人生 > >Android端身份證識別

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

GitHub

希望大家點一波github的關注,謝謝大家!