赞
踩
最近因为项目需要,进行了集成百度身份证识别的验证damo;
很多地方都是按照官方的来的,能力强的小伙伴可以直接看官方damo;
一,创建项目,并下载SDK
1>去百度大脑处注册账号并创建项目,地址:https://ai.baidu.com/
1.1点击控制台,进入管理中心
1.2 进入管理中心后,点击左侧产品服务,选择文字识别
1.3 进入文字识别概览,选择创建应用,点击立即创建
1.4 按照要求填好资料,出于安全考虑还是绑定包名
1.4提示创建成功后点击 下载SDK
1.5下载 文字识别里的Android SDK
二,集成SDK
2.1 把包内的libs文件下的所有文件放入Android Stuio项目中的libs里
当然ocr-sdk.jar包记得 右键add as library;
由于个人习惯的原因,官方要求的是放到jnilibs 我没有按照官方要求的做,所以还要在build.gradle里添加以下代码
sourceSets {
main {
jniLibs.srcDir(['libs'])
}
}
2.2 把orc_ui文件以模块方式导入到项目里
2.3 引入后还有最后一步,把授权文件aip.license放入到assets目录中,这步很重要,不做会导致授权失败,无法识别
授权文件 aip.license在这个位置下载
三,代码实现
首先是布局
- <?xml version="1.0" encoding="utf-8"?>
-
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_idcard"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context="com.example.administrator.baiduidcard.MainActivity">
-
- <Button
- android:text="相册选择 正面"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/gallery_button_front"
- tools:ignore="HardcodedText"/>
-
- <Button
- android:text="相册选择 反面"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/gallery_button_back"
- tools:ignore="HardcodedText"/>
-
- <Button
- android:id="@+id/id_card_front_button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="身份证正面"
- tools:ignore="HardcodedText" />
-
- <Button
- android:id="@+id/id_card_back_button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="身份证反面"
- tools:ignore="HardcodedText" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="姓名"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_name"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp" />
-
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="性别"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_gender"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp"/>
-
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="民族"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_ethnic"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp" />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="生日"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_birthday"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp"/>
-
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="住址"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_address"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp" />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="身份证号"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_idNumber"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp"/>
-
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="签发机关"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_issueAuthority"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp"/>
-
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="20dp"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:text="有效期限"
- android:gravity="center"/>
-
- <TextView
- android:id="@+id/tv_youxiaodate"
- android:layout_width="0dp"
- android:layout_weight="3"
- android:layout_height="20dp"/>
-
- </LinearLayout>
-
- </LinearLayout>
- package com.example.administrator.baiduidcard;
-
- import android.Manifest;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.pm.PackageManager;
- import android.database.Cursor;
- import android.net.Uri;
- import android.provider.MediaStore;
- import android.support.v4.app.ActivityCompat;
- import android.support.v7.app.AlertDialog;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.text.TextUtils;
- import android.view.View;
- import android.widget.TextView;
-
-
- import com.baidu.ocr.sdk.OCR;
- import com.baidu.ocr.sdk.OnResultListener;
- import com.baidu.ocr.sdk.exception.OCRError;
- import com.baidu.ocr.sdk.model.AccessToken;
- import com.baidu.ocr.sdk.model.IDCardParams;
- import com.baidu.ocr.sdk.model.IDCardResult;
- import com.baidu.ocr.ui.camera.CameraActivity;
-
- import java.io.File;
-
- public class MainActivity extends AppCompatActivity {
-
- private static final int REQUEST_CODE_PICK_IMAGE_FRONT = 201;
- private static final int REQUEST_CODE_PICK_IMAGE_BACK = 202;
- private static final int REQUEST_CODE_CAMERA = 102;
- private AlertDialog.Builder alertDialog;
- private TextView tv_name,tv_gender,tv_ethnic,tv_birthday,tv_address,tv_idNumber,tv_issueAuthority,tv_youxiaodate;
-
- private boolean checkGalleryPermission() {
- int ret = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission
- .READ_EXTERNAL_STORAGE);
- if (ret != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(MainActivity.this,
- new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},
- 1000);
- return false;
- }
- return true;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- alertDialog = new AlertDialog.Builder(this);
-
- tv_name = (TextView) findViewById(R.id.tv_name);
- tv_gender = (TextView) findViewById(R.id.tv_gender);
- tv_ethnic = (TextView) findViewById(R.id.tv_ethnic);
- tv_birthday = (TextView) findViewById(R.id.tv_birthday);
- tv_address = (TextView) findViewById(R.id.tv_address);
- tv_idNumber = (TextView) findViewById(R.id.tv_idNumber);
- tv_issueAuthority = (TextView) findViewById(R.id.tv_issueAuthority);
- tv_youxiaodate = (TextView) findViewById(R.id.tv_youxiaodate);
-
- findViewById(R.id.gallery_button_front).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (checkGalleryPermission()) {
- Intent intent = new Intent(Intent.ACTION_PICK);
- intent.setType("image/*");
- startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE_FRONT);
- }
- }
- });
-
- findViewById(R.id.gallery_button_back).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (checkGalleryPermission()) {
- Intent intent = new Intent(Intent.ACTION_PICK);
- intent.setType("image/*");
- startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE_BACK);
- }
- }
- });
-
- findViewById(R.id.id_card_front_button).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,
- FileUtil.getSaveFile(getApplication()).getAbsolutePath());
- intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
- startActivityForResult(intent, REQUEST_CODE_CAMERA);
- }
- });
-
- findViewById(R.id.id_card_back_button).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,
- FileUtil.getSaveFile(getApplication()).getAbsolutePath());
- intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
- startActivityForResult(intent, REQUEST_CODE_CAMERA);
- }
- });
-
- OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() {
- @Override
- public void onResult(AccessToken result) {
- // 调用成功,返回AccessToken对象
- String token = result.getAccessToken();
- }
- @Override
- public void onError(OCRError error) {
- // 调用失败,返回OCRError子类SDKError对象
- }
- }, getApplicationContext());
- }
-
- private void recIDCard(final 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) {
- if (idCardSide.equals("front")){
- tv_name.setText(result.getName().toString());
- tv_gender.setText(result.getGender().toString());
- tv_ethnic.setText(result.getEthnic().toString());
- tv_birthday.setText(result.getBirthday().toString());
- tv_address.setText(result.getAddress().toString());
- tv_idNumber.setText(result.getIdNumber().toString());
- }else if (idCardSide.equals("back")){
- tv_issueAuthority.setText(result.getIssueAuthority().toString());
- tv_youxiaodate.setText(result.getSignDate()+"-"+result.getExpiryDate());
- }
- }
- }
-
- @Override
- public void onError(OCRError error) {
- alertText("", error.getMessage());
- }
- });
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == REQUEST_CODE_PICK_IMAGE_FRONT && resultCode == Activity.RESULT_OK) {
- Uri uri = data.getData();
- String filePath = getRealPathFromURI(uri);
- recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, filePath);
- }
-
- if (requestCode == REQUEST_CODE_PICK_IMAGE_BACK && resultCode == Activity.RESULT_OK) {
- Uri uri = data.getData();
- String filePath = getRealPathFromURI(uri);
- recIDCard(IDCardParams.ID_CARD_SIDE_BACK, filePath);
- }
-
- 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);
- }
- }
- }
- }
- }
-
- private void alertText(final String title, final String message) {
- this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- alertDialog.setTitle(title)
- .setMessage(message)
- .setPositiveButton("确定", null)
- .show();
- }
- });
- }
-
- private String getRealPathFromURI(Uri contentURI) {
- String result;
- Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
- if (cursor == null) { // Source is Dropbox or other similar local file path
- result = contentURI.getPath();
- } else {
- cursor.moveToFirst();
- int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
- result = cursor.getString(idx);
- cursor.close();
- }
- return result;
- }
- }
还有个FileUtil工具类
- /*
- * Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
- */
- package com.example.administrator.baiduidcard;
-
- import android.content.Context;
-
- import java.io.File;
-
- public class FileUtil {
- public static File getSaveFile(Context context) {
- File file = new File(context.getFilesDir(), "pic.jpg");
- return file;
- }
- }
以上就是全部代码,有错误还望指正,转发请注明出处!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。