当前位置:   article > 正文

Android 集成百度身份证识别_cameranativehelper.init

cameranativehelper.init

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

第一步:创建项目,下载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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

然后是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();

}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/683059
推荐阅读
相关标签
  

闽ICP备14008679号