快速高效 | Android身份證識別

FBY展菲發表於2018-01-11

一:簡介

快捷支付涉及到方方面面,同時安全問題既是使用者所關心的,也是製作者不容忽視的重要部分。 比如涉及到支付和金錢的app,商戶端app等等,都需要進行實名認證,實名認證可以通過銀行卡認證和身份證認證。 通常辦法是通過上傳照片,並且手動輸入基本資訊進行認證,這種方法不僅操作複雜,而且容易出錯。 網上很多資源,識別率低,速度慢,使用者體驗很差。今天我就和大家介紹一下我使用的方法,可以快速、高效的識別中國身份證資訊。

二:原理

在拍攝框中右上區域加了一個人像區域提示框,並將該區域設為掃描人臉的區域,只有該區域掃描到身份證上的人臉時(確保使用者的確將身份證人像對準了拍攝框中的人像框),才執行讀取身份證資訊的操作。

三:專案展示

掃描身份證面截圖

頭像面掃描

國徽面掃描

資訊展示頁面

頭像頁資訊

國徽頁資訊

四: 使用流程介紹

4.1 身份驗證

由於使用的是百度雲的影象文字識別sdk,首先需要去百度雲管理控制檯 獲得API Key / Secret Key。

管理控制檯

管理控制檯

4.2 下載demo

  1. 將下載的demo中libs目錄下的ocr-sdk.jar檔案拷貝到工程libs目錄中,並加入工程依賴
  2. 將libs目錄下armeabi,arm64-v8a,armeabi-v7a,x86資料夾按需新增到android studio工程src/main/jniLibs目錄中, eclipse使用者預設為libs目錄。
  3. 在Android studio中以模組方式匯入下載包中的identify資料夾,模組方式匯入流程如下: 首先要在頂層工程目錄下的settings.gradle檔案中include模組名
include ':app',':identify'
複製程式碼

然後直接複製貼上identify檔案匯入到專案的資料夾中!!!然後Build>Rebuild Project,重新構建專案。

4.3 許可權配置

  1. 在工程AndroidManifest.xml檔案中新增如下許可權:
<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. 在Proguard配置檔案中增加, 防止release釋出時打包報錯:
-keep class com.baidu.ocr.sdk.**{*;}
-dontwarn com.baidu.ocr.**
複製程式碼

4.4 核心函式介紹

  1. 初始化函式
OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
            @Override
            public void onResult(AccessToken result) {

            }

            @Override
            public void onError(OCRError error) {
                error.printStackTrace();
                Log.d("onError", "msg: " + error.getMessage());
            }
        }, getApplicationContext(), "你註冊的appkey", "你註冊的sk");
複製程式碼
  1. 身份證拍照
Intent intent = new Intent(MainActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
    FileUtil.getSaveFile(getApplication()).getAbsolutePath());
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
複製程式碼
  1. 影象回撥
@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 = FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath();
            if (!TextUtils.isEmpty(contentType)) {
                if (CameraActivity.CONTENT_TYPE_ID_CARD_FRONT.equals(contentType)) {
                    recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, filePath);
                } else if (CameraActivity.CONTENT_TYPE_ID_CARD_BACK.equals(contentType)) {
                    recIDCard(IDCardParams.ID_CARD_SIDE_BACK, filePath);
                }
            }
        }
    }
}
複製程式碼
  1. 資料解析
private void recIDCard(String idCardSide, String filePath) {
    IDCardParams param = new IDCardParams();
    param.setImageFile(new File(filePath));
    param.setIdCardSide(idCardSide);
    param.setDetectDirection(true);
    OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {
        @Override
        public void onResult(IDCardResult result) {
            if (result != null) {
                Log.d("onResult", "result: " + result.toString());
            }
        }

        @Override
        public void onError(OCRError error) {
            Log.d("onError", "error: " + error.getMessage());
        }
    });
}
複製程式碼

到此身份證識別接入就結束了!!!

相同方式均可實現銀行卡識別、駕駛證識別、行駛證識別、車牌識別、營業執照識別等等,如有需要demo可聯絡我。

原始碼Demo獲取方法

關注 【網羅開發】微信公眾號,回覆【162】便可領取。 網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,所有文件會持續更新,歡迎關注一起成長!

希望可以幫助大家, 如有問題可加QQ技術交流群: 591625129。 如果哪裡有什麼不對或者不足的地方,還望讀者多多提意見或建議。 如需轉載請聯絡我,經過授權方可轉載,謝謝

本篇已同步到個人部落格:FBY展菲

相關文章