Android 集成百度身份证识别

最近因为项目需要实现身份证识别与读取,对百度的文字识别进行了集成。很多地方都是参照官方文档来写,能力强的老哥可以去官方文档自行查阅。

第一步:创建项目,下载SDK

https://cloud.baidu.com/?from=console
在这里插入图片描述
在官网创建项目,下载SDK即可
第二步:集成SDK
1.把包内的libs文件下的SDK文件放入Android Stuio项目中的libs里
2.将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程src/main/jniLibs目录中
在这里插入图片描述
在这里插入图片描述
当然ocr-sdk.jar包记得 右键add as library;

3.将orc_ui文件以模块方式导入到项目里
具体操作参考:https://blog.csdn.net/u013023845/article/details/85160792

第三步:代码实现

首先是布局,大家可以根据需求自己来制定
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F2F2F2"
tools:context=".IdCardActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:background="#ffffff"
    android:orientation="horizontal"
    android:layout_height="@dimen/dp_49">
    <ImageView
        android:id="@+id/back"
        android:layout_width="@dimen/dp_10"
        android:layout_height="@dimen/dp_18"
        android:background="@drawable/back"
        android:layout_marginTop="@dimen/dp_19"
        android:layout_marginLeft="@dimen/dp_13"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/dp_129"
        android:text="证件照片"
        android:textColor="#333333"
        android:layout_marginTop="@dimen/dp_19"
        android:textSize="18sp" />
</LinearLayout>
<LinearLayout
    android:layout_marginTop="@dimen/dp_49"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拍摄上传您的二代身份证"
        android:textSize="@dimen/sp_14"
        android:textColor="#333333"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/dp_26"
        />
    <ImageView
        android:id="@+id/id_card_front_button_auto"
        android:layout_width="@dimen/dp_320"
        android:layout_height="@dimen/dp_229"
        android:background="@drawable/hitozura"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/dp_20"
        />
    <ImageView
        android:id="@+id/id_card_back_button_auto"
        android:layout_width="@dimen/dp_320"
        android:layout_height="@dimen/dp_230"
        android:background="@drawable/rear"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/dp_37"
        />
</LinearLayout></RelativeLayout>

然后是Activity实现:

public class IdCardActivity extends AppCompatActivity {
private static final int REQUEST_CODE_CAMERA = 102;
private static final int REQUEST_CODE_DRIVING_LICENSE = 103;
private static final int REQUEST_CODE_VEHICLE_LICENSE = 104;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_id_card);
    findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
    // 正面(自动)
    findViewById(R.id.id_card_front_button_auto).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IdCardActivity.this, CameraActivity.class);
            intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                    FileUtil.getSaveFile(getApplication()).getAbsolutePath());
            intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
            // KEY_NATIVE_MANUAL设置了之后CameraActivity中不再自动初始化和释放模型
            // 请手动使用CameraNativeHelper初始化和释放模型
            // 推荐这样做,可以避免一些activity切换导致的不必要的异常
            intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true);
            intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
            startActivityForResult(intent, REQUEST_CODE_CAMERA);
        }
    });

    // 反面(自动)
    findViewById(R.id.id_card_back_button_auto).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IdCardActivity.this, CameraActivity.class);
            intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                    FileUtil.getSaveFile(getApplication()).getAbsolutePath());
            intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
            // KEY_NATIVE_MANUAL设置了之后CameraActivity中不再自动初始化和释放模型
            // 请手动使用CameraNativeHelper初始化和释放模型
            // 推荐这样做,可以避免一些activity切换导致的不必要的异常
            intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true);
            intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
            startActivityForResult(intent, REQUEST_CODE_CAMERA);
        }
    });
    // 初始化
    initAccessTokenWithAkSk();
}
private void initAccessTokenWithAkSk() {
    OCR.getInstance(IdCardActivity.this).initAccessTokenWithAkSk(
            new OnResultListener<AccessToken>() {
                @Override
                public void onResult(AccessToken result) {

                    // 本地自动识别需要初始化
                    initLicense();

                    Log.d("MainActivity", "onResult: " + result.toString());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(IdCardActivity.this, "初始化认证成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onError(OCRError error) {
                    error.printStackTrace();
                    Log.e("MainActivity", "onError: " + error.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(IdCardActivity.this, "初始化认证失败,请检查 key", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }, getApplicationContext(),
            // 需要自己配置 https://console.bce.baidu.com
            "88R6a3Fky9l5jcpOV0qNuFVh",
            // 需要自己配置 https://console.bce.baidu.com
            "a0GPi4bzLzuT9dDpU5Zp1Ce7InFDAjUw");
}
private void initLicense() {
    CameraNativeHelper.init(this, OCR.getInstance(IdCardActivity.this).getLicense(),
            new CameraNativeHelper.CameraNativeInitCallback() {
                @Override
                public void onError(int errorCode, Throwable e) {
                    final String msg;
                    switch (errorCode) {
                        case CameraView.NATIVE_SOLOAD_FAIL:
                            msg = "加载so失败,请确保apk中存在ui部分的so";
                            break;
                        case CameraView.NATIVE_AUTH_FAIL:
                            msg = "授权本地质量控制token获取失败";
                            break;
                        case CameraView.NATIVE_INIT_FAIL:
                            msg = "本地质量控制";
                            break;
                        default:
                            msg = String.valueOf(errorCode);
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(IdCardActivity.this,
                                    "本地质量控制初始化错误,错误原因: " + msg, Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
}

@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);
                }
            }
        }
    }

}

/**
 * 解析身份证图片
 *
 * @a0GPi4bzLzuT9dDpU5Zp1Ce7InFDAjUw param idCardSide 身份证正反面
 * @param filePath   图片路径
 */
private void recIDCard(final String idCardSide, String filePath) {
    IDCardParams param = new IDCardParams();
    param.setImageFile(new File(filePath));
    // 设置身份证正反面
    param.setIdCardSide(idCardSide);
    // 设置方向检测
    param.setDetectDirection(true);
    // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
    param.setImageQuality(40);
    OCR.getInstance(IdCardActivity.this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
        @Override
        public void onResult(IDCardResult result) {
            if (result != null) {

                String name = "";
                String sex = "";
                String nation = "";
                String num = "";
                String address = "";
                String issueAuthority = "";
                String expiryDate = "";
                if (result.getName() != null) {
                    name = result.getName().toString();
                }
                if (result.getGender() != null) {
                    sex = result.getGender().toString();
                }
                if (result.getEthnic() != null) {
                    nation = result.getEthnic().toString();
                }
                if (result.getIdNumber() != null) {
                    num = result.getIdNumber().toString();
                }
                if (result.getAddress() != null) {
                    address = result.getAddress().toString();
                }
                if (result.getIssueAuthority() != null) {
                    issueAuthority = result.getIssueAuthority().toString();
                }
                if (result.getExpiryDate() != null) {
                    expiryDate = result.getExpiryDate().toString();
                }
                if (idCardSide.equals("front")){
                    Toast.makeText(IdCardActivity.this, "姓名: " + name + "\n" +
                            "性别: " + sex + "\n" +
                            "民族: " + nation + "\n" +
                            "身份证号码: " + num + "\n" +
                            "住址: " + address + "\n", Toast.LENGTH_SHORT).show();
                }else if (idCardSide.equals("back")){
                    Toast.makeText(IdCardActivity.this, "签发机关: " + issueAuthority + "\n" +
                            "到期时间: " + expiryDate + "\n" , Toast.LENGTH_SHORT).show();

                }


            }
        }

        @Override
        public void onError(OCRError error) {
            Toast.makeText(IdCardActivity.this, "识别出错,请查看log错误代码", Toast.LENGTH_SHORT).show();
            Log.d("MainActivity", "onError: " + error.getMessage());
        }
    });
}
@Override
protected void onDestroy() {
    CameraNativeHelper.release();
    // 释放内存资源
    OCR.getInstance(IdCardActivity.this).release();
    super.onDestroy();

}
}

以上就是全部代码,有错请大家指正!稍后会上传Github以供大家参阅。
Demo内封装了身份证识别和银行卡绑定实例代码,使用时将Api Key和Secret Key替换为自己的就可以直接使用。
github地址:
https://github.com/qingfeng0213/CardView

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android百度人脸识别Demo是一个基于百度人脸识别技术开发的Android应用程序示例。该Demo旨在展示如何使用百度人脸识别SDK来实现人脸的检测、识别和验证等功能。 通过该Demo,我们可以实现以下功能: 1. 人脸检测:能够在图像或摄像头帧中检测人脸的位置、大小和角度信息。 2. 人脸比对:能够对两张人脸图像进行比对,判断是否属于同一人。 3. 人脸搜索:能够对一组已知人脸图像进行搜索,找到与查询人脸最相似的人脸。 4. 人脸注册:能够将一张人脸图像注册到人脸库中,方便后续的比对和搜索操作。 5. 人脸属性分析:能够分析人脸的年龄、性别、表情等属性信息。 使用该Demo,我们可以将百度人脸识别能力集成到我们自己的Android应用程序中,为用户提供更加安全、方便和智能的人脸识别功能。比如,我们可以结合人脸识别技术来实现人脸解锁、人脸支付、人脸签到等应用场景。 在使用百度人脸识别Demo前,我们需要先在百度开放平台注册账号,创建应用并获取到相应的API Key和Secret Key,然后将其配置到Demo中。此外,我们还需要在Android设备上配置相机权限,以便Demo能够调用摄像头进行人脸检测和识别。 总之,Android百度人脸识别Demo是一个非常实用的示例程序,能够帮助我们了解并应用百度人脸识别功能,为我们的Android应用程序增加更多智能化的特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值