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的關注,謝謝大家!