一、在百度AI官网下载文字识别的SDK
步骤一、 权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
下载完解压到根目录,打开libs会有一个ocr-sdk.jar还有4个文件夹
-
把ocr-sdk.jar和四个文件夹放进项目的libs文件里
-
导入Model,把我下面指定的ocr_ui导入到项目里,OCRDemo是一个demo可以进行参考,至于怎么导入ocr_ui往下看我给大家截图看一下
-
在main下建一个新文件夹assets把下载的aip.license放进去
-
**这是导入ocr_ui的直接方式,还有其他方式导入你们也可以用你们自己的方式,不会导入的可以用我的方式进行导入 **
-
目前已经配置第三方的已经配置完了,最后再给大家一个依赖复制到自己的项目里,我的项目是weidujiangkang
这个依赖就是跟咱们导入的ocr_ui进行关联的 下面jniLibs和EventBus存入build.gradle的android里
//jniLibs
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
//EventBus
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
下面的依赖加入build.gradle的dependencies里
//EventBus 依赖
implementation 'org.greenrobot:eventbus:3.1.1'
//百度识别依赖
compile 'com.android.support:appcompat-v7:25.1.1'
compile files('libs/ocr-sdk.jar')
compile project(path: ':ocr_ui')
- 混淆的依赖
-keep class com.baidu.ocr.sdk.**{*;}
-dontwarn com.baidu.ocr.**
XML
<?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="#fff"
android:orientation="vertical"
tools:context=".shezhi.RealnameActivity">
<LinearLayout
android:id="@+id/qq"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#fff"
android:orientation="horizontal"
>
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:id="@+id/xin_fan"
android:layout_margin="20dp"
android:src="@mipmap/common_icon_back_black_n"
>
</ImageView>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="实名认证"
android:layout_marginRight="50dp"
android:textSize="20sp"
android:gravity="center"
>
</TextView>
</LinearLayout>
<TextView
android:id="@+id/ww"
android:layout_below="@+id/qq"
android:layout_width="match_parent"
android:layout_height="7dp"
android:background="#F2ECEC"
>
</TextView>
<ImageView
android:layout_below="@+id/ww"
android:id="@+id/ee"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="30dp"
android:src="@mipmap/zheng"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
>
</ImageView>
<ImageView
android:id="@+id/shi_xiang"
android:layout_below="@+id/ww"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/ji"
android:layout_marginTop="65dp"
android:layout_centerHorizontal="true"
>
</ImageView>
<TextView
android:id="@+id/shi_xiang2"
android:layout_below="@+id/shi_xiang"
android:layout_width="wrap_content"
android:layout_marginTop="15dp"
android:layout_centerHorizontal="true"
android:layout_height="wrap_content"
android:text="点击拍摄/上传人面像"
android:textStyle="bold"
android:textColor="#0091EA"
>
</TextView>
<ImageView
android:id="@+id/rr"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_below="@+id/ee"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:src="@mipmap/fanmian"
>
</ImageView>
<ImageView
android:id="@+id/tt"
android:layout_below="@+id/ee"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/ji"
android:layout_marginTop="60dp"
android:layout_centerHorizontal="true"
>
</ImageView>
<TextView
android:id="@+id/tt2"
android:layout_below="@+id/tt"
android:layout_width="wrap_content"
android:layout_marginTop="15dp"
android:layout_centerHorizontal="true"
android:layout_height="wrap_content"
android:text="点击拍摄/上传国徽面"
android:textStyle="bold"
android:textColor="#0091EA"
>
</TextView>
<TextView
android:id="@+id/xiayibu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/rr"
android:text="完成"
android:gravity="center"
android:padding="10dp"
android:background="@drawable/xiu_mima"
android:textColor="#fff"
android:layout_margin="30dp"
>
</TextView>
</RelativeLayout>
在这里我给大家看一下 我的这个布局效果
MainActivity类
@BindView(R.id.xin_fan)
ImageView xinFan;
@BindView(R.id.qq)
LinearLayout qq;
@BindView(R.id.ww)
TextView ww;
@BindView(R.id.ee)
ImageView ee;
@BindView(R.id.shi_xiang)
ImageView shiXiang;
@BindView(R.id.rr)
ImageView rr;
@BindView(R.id.tt)
ImageView tt;
@BindView(R.id.xiayibu)
TextView xiayibu;
@BindView(R.id.shi_xiang2)
TextView shiXiang2;
@BindView(R.id.tt2)
TextView tt2;
private static final int REQUEST_CODE_CAMERA = 102;
private String filePath; //获取到的照片
private boolean a = true; //正面照片
private boolean b = true; //反面照片
String name = "";
String sex = "";
String nation = "";
String num = "";
String address = "";
String issueAuthority = "";
String birthday = "";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_realname;);
ButterKnife.bind(this);
//正面扫描
shiXiang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RealnameActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtil.getSaveFile(getApplication()).getAbsolutePath());
intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true);
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
});
//反面扫描
tt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RealnameActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtil.getSaveFile(getApplication()).getAbsolutePath());
intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true);
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
});
//点击下一步就开始获取照片的内容进行加密上传
xiayibu.setOnClickListener(new View.OnClickListener() {
private String s7;
private String s6;
private String s5;
private String s4;
private String s3;
private String s1;
private String s2;
//判断是否上传上照片
@Override
public void onClick(View v) {
if (a & b == true) {
Toast.makeText(RealnameActivity.this, "请上传前后照片", Toast.LENGTH_SHORT).show();
} else if (a == true) {
Toast.makeText(RealnameActivity.this, "请输入前照片", Toast.LENGTH_SHORT).show();
} else if (b == true) {
Toast.makeText(RealnameActivity.this, "请输入后照片", Toast.LENGTH_SHORT).show();
} else {
try {
s1 = RsaCoder.encryptByPublicKey(name);
s2 = RsaCoder.encryptByPublicKey(sex);
s3 = RsaCoder.encryptByPublicKey(nation);
s7 = RsaCoder.encryptByPublicKey(birthday);
s4 = RsaCoder.encryptByPublicKey(num);
s5 = RsaCoder.encryptByPublicKey(address);
s6 = RsaCoder.encryptByPublicKey(issueAuthority);
} catch (Exception e) {
e.printStackTrace();
}
SharedPreferences user = MyApp.context.getSharedPreferences("user", MODE_PRIVATE);
String userId = user.getString("userId", "");
//mvp调用Presenter层
aPresenter.ShowShenPresenter(userId,s1,s2,s3,s7,s5,s4,s6);
Intent intent = new Intent(RealnameActivity.this, ShenFxActivity.class);
startActivity(intent);
finish();
}
}
});
//点击←返回
xinFan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RealnameActivity.this, ShenFxActivity.class);
startActivity(intent);
finish();
}
});
// 初始化
initAccessTokenWithAkSk();
}
在onCreate方法外写初始化,记得更换你自己的AK,SK;
private void initAccessTokenWithAkSk() {
OCR.getInstance(RealnameActivity.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(RealnameActivity.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(RealnameActivity.this, "初始化认证失败,请检查 key", Toast.LENGTH_SHORT).show();
}
});
}
}, getApplicationContext(),
// 需要自己配置 https://console.bce.baidu.com
"您自己的AK",
// 需要自己配置 https://console.bce.baidu.com
"您自己的SK");
}
private void initLicense() {
CameraNativeHelper.init(this, OCR.getInstance(RealnameActivity.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(RealnameActivity.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);
//照片
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);
ee.setImageURI(Uri.parse(filePath));
shiXiang.setVisibility(View.GONE);
shiXiang2.setVisibility(View.GONE);
a = false;
} else if (CameraActivity.CONTENT_TYPE_ID_CARD_BACK.equals(contentType)) {
recIDCard(IDCardParams.ID_CARD_SIDE_BACK, filePath);
rr.setImageURI(Uri.parse(filePath));
tt.setVisibility(View.GONE);
tt2.setVisibility(View.GONE);
b = false;
}
}
}
}
}
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(RealnameActivity.this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null) {
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.getBirthday() != null) {
birthday = result.getBirthday().toString(); //生日
}
if (result.getIssueAuthority() != null) {
issueAuthority = result.getIssueAuthority().toString(); //签发机关
}
if (idCardSide.equals("front")) {
Toast.makeText(RealnameActivity.this, "姓名: " + name + "\n" +
"性别: " + sex + "\n" +
"民族: " + nation + "\n" +
"身份证号码: " + num + "\n" +
"住址: " + address + "\n"
"生日: " + address + "\n", Toast.LENGTH_SHORT).show();
} else if (idCardSide.equals("back")) {
Toast.makeText(RealnameActivity.this, "签发机关: " + issueAuthority + "\n", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onError(OCRError error) {
Toast.makeText(RealnameActivity.this, "识别出错,请查看log错误代码", Toast.LENGTH_SHORT).show();
Log.d("MainActivity", "onError: " + error.getMessage());
}
});
}
@Override
protected void onDestroy() {
CameraNativeHelper.release();
// 释放内存资源
OCR.getInstance(RealnameActivity.this).release();
super.onDestroy();
}
嘿嘿,到这里实现获取身份证的信息以及绑定就成功了!!!