隨著發(fā)展大多數(shù)App現(xiàn)在都會用到身份證,銀行卡等識別功能,今天就集成一下百度的OCR識別功能,或不多說,開始整:
第一步:先登錄百度智能云

登錄進(jìn)入,沒有百度賬號的需要注冊一下,進(jìn)入界面找到如下圖文字識別

進(jìn)入文字識別主界面,可以看到一些你集成百度OCR識別功能的調(diào)用詳細(xì)數(shù)據(jù)的,如下圖

然后點(diǎn)擊創(chuàng)建應(yīng)用(借用下百度文檔圖片)

這里因?yàn)楸WCAk的安全所以百度希望通過授權(quán)的方式初始化Ak,因?yàn)榉诺巾椖坷锩婧苋菀妆粍e人破解

下載如上圖的文件,然后放到我們需要集成的應(yīng)用里面的main下面新建一個assets文件里面

做完這些還有 一個最重要的前期準(zhǔn)備,那就是去下載SDK(http://ai.baidu.com/sdk/#ocr)
下載完成后,得到壓縮包,解壓如下圖

做完這些后就可以開始集成了
1.(必須)將下載包libs目錄中的ocr-sdk.jar文件拷貝到工程libs目錄中,并加入工程依賴。
2.(必須)將libs目錄下armeabi,arm64-v8a,armeabi-v7a,x86文件夾按需添加到android studio工程src/main/jniLibs目錄中。這里如果不想手動創(chuàng)建jniLibs這這個文件夾,只需要在gradle文件里面的Android下加上如下圖這句話
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
3.可選)如果需要使用UI模塊,請在Android studio中以模塊方式導(dǎo)入下載包中的ocr-ui文件夾。這個看個人意愿,如果需求可以自己去實(shí)現(xiàn),這里就介紹導(dǎo)入的,很簡單只需要

然后一路next即可。
然后就可以實(shí)現(xiàn)功能了,下面是項目目錄以及代碼

package com.qy.myocrdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
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.ui.camera.CameraActivity;
import com.qy.myocrdemo.activity.IDCardActivity;
import com.qy.myocrdemo.utils.FileUtil;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
* 主頁
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView tvResult;
Button btn, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14, btn15, btn16;
private static final int REQUEST_CODE_GENERAL = 105;
private static final int REQUEST_CODE_GENERAL_BASIC = 106;
private static final int REQUEST_CODE_ACCURATE_BASIC = 107;
private static final int REQUEST_CODE_ACCURATE = 108;
private static final int REQUEST_CODE_GENERAL_ENHANCED = 109;
private static final int REQUEST_CODE_GENERAL_WEBIMAGE = 110;
private static final int REQUEST_CODE_BANKCARD = 111;
private static final int REQUEST_CODE_VEHICLE_LICENSE = 120;
private static final int REQUEST_CODE_DRIVING_LICENSE = 121;
private static final int REQUEST_CODE_LICENSE_PLATE = 122;
private static final int REQUEST_CODE_BUSINESS_LICENSE = 123;
private static final int REQUEST_CODE_RECEIPT = 124;
private static final int REQUEST_CODE_PASSPORT = 125;
private static final int REQUEST_CODE_NUMBERS = 126;
private static final int REQUEST_CODE_QRCODE = 127;
private static final int REQUEST_CODE_BUSINESSCARD = 128;
private static final int REQUEST_CODE_HANDWRITING = 129;
private static final int REQUEST_CODE_LOTTERY = 130;
private static final int REQUEST_CODE_VATINVOICE = 131;
private static final int REQUEST_CODE_CUSTOM = 132;
private boolean hasGotToken = false;
private AlertDialog.Builder alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.result);
btn = findViewById(R.id.btn);
btn1 = findViewById(R.id.btn1);
btn2 = findViewById(R.id.btn2);
btn3 = findViewById(R.id.btn3);
btn4 = findViewById(R.id.btn4);
btn5 = findViewById(R.id.btn5);
btn6 = findViewById(R.id.btn6);
btn7 = findViewById(R.id.btn7);
btn8 = findViewById(R.id.btn8);
btn9 = findViewById(R.id.btn9);
btn10 = findViewById(R.id.btn10);
btn11 = findViewById(R.id.btn11);
btn12 = findViewById(R.id.btn12);
btn13 = findViewById(R.id.btn13);
btn14 = findViewById(R.id.btn14);
btn15 = findViewById(R.id.btn15);
btn16 = findViewById(R.id.btn16);
alertDialog = new AlertDialog.Builder(this);
initAccessToken();
btn.setOnClickListener(this);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
btn6.setOnClickListener(this);
btn7.setOnClickListener(this);
btn8.setOnClickListener(this);
btn9.setOnClickListener(this);
btn10.setOnClickListener(this);
btn11.setOnClickListener(this);
btn12.setOnClickListener(this);
btn13.setOnClickListener(this);
btn14.setOnClickListener(this);
btn15.setOnClickListener(this);
btn16.setOnClickListener(this);
}
/**
* 檢測token是否未成功獲取
*
* @return
*/
private boolean checkTokenStatus() {
if (!hasGotToken) {
Toast.makeText(getApplicationContext(), "token還未成功獲取", Toast.LENGTH_LONG).show();
}
return hasGotToken;
}
/**
* 以license文件方式初始化
*/
private void initAccessToken() {
OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {
@Override
public void onResult(AccessToken accessToken) {
String token = accessToken.getAccessToken();
hasGotToken = true;
}
@Override
public void onError(OCRError error) {
error.printStackTrace();
alertText("licence方式獲取token失敗", error.getMessage());
}
}, getApplicationContext());
}
/**
* 提示彈出框
*
* @param title
* @param message
*/
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();
}
});
}
/**
* 回調(diào)結(jié)果
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 識別成功回調(diào),通用文字識別(含位置信息)
if (requestCode == REQUEST_CODE_GENERAL && resultCode == Activity.RESULT_OK) {
RecognizeService.recGeneral(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),通用文字識別(含位置信息)", result);
}
});
}
// 識別成功回調(diào),通用文字識別(含位置信息高精度版)
if (requestCode == REQUEST_CODE_ACCURATE && resultCode == Activity.RESULT_OK) {
RecognizeService.recAccurate(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),通用文字識別(含位置信息高精度版)", result);
}
});
}
// 識別成功回調(diào),通用文字識別
if (requestCode == REQUEST_CODE_GENERAL_BASIC && resultCode == Activity.RESULT_OK) {
RecognizeService.recGeneralBasic(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),通用文字識別", result);
}
});
}
// 識別成功回調(diào),通用文字識別(高精度版)
if (requestCode == REQUEST_CODE_ACCURATE_BASIC && resultCode == Activity.RESULT_OK) {
RecognizeService.recAccurateBasic(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),通用文字識別(高精度版)", result);
}
});
}
// 識別成功回調(diào),通用文字識別(含生僻字版)
if (requestCode == REQUEST_CODE_GENERAL_ENHANCED && resultCode == Activity.RESULT_OK) {
RecognizeService.recGeneralEnhanced(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),通用文字識別(含生僻字版)", result);
}
});
}
// 識別成功回調(diào),網(wǎng)絡(luò)圖片文字識別
if (requestCode == REQUEST_CODE_GENERAL_WEBIMAGE && resultCode == Activity.RESULT_OK) {
RecognizeService.recWebimage(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),網(wǎng)絡(luò)圖片文字識別", result);
}
});
}
// 識別成功回調(diào),銀行卡識別
if (requestCode == REQUEST_CODE_BANKCARD && resultCode == Activity.RESULT_OK) {
RecognizeService.recBankCard(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),銀行卡識別", result);
}
});
}
// 識別成功回調(diào),行駛證識別
if (requestCode == REQUEST_CODE_VEHICLE_LICENSE && resultCode == Activity.RESULT_OK) {
RecognizeService.recVehicleLicense(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),行駛證識別", result);
}
});
}
// 識別成功回調(diào),駕駛證識別
if (requestCode == REQUEST_CODE_DRIVING_LICENSE && resultCode == Activity.RESULT_OK) {
RecognizeService.recDrivingLicense(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),駕駛證識別", result);
}
});
}
// 識別成功回調(diào),車牌識別
if (requestCode == REQUEST_CODE_LICENSE_PLATE && resultCode == Activity.RESULT_OK) {
RecognizeService.recLicensePlate(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),車牌識別", result);
}
});
}
// 識別成功回調(diào),營業(yè)執(zhí)照識別
if (requestCode == REQUEST_CODE_BUSINESS_LICENSE && resultCode == Activity.RESULT_OK) {
RecognizeService.recBusinessLicense(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),營業(yè)執(zhí)照識別", result);
}
});
}
// 識別成功回調(diào),通用票據(jù)識別
if (requestCode == REQUEST_CODE_RECEIPT && resultCode == Activity.RESULT_OK) {
RecognizeService.recReceipt(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),通用票據(jù)識別", result);
}
});
}
// 識別成功回調(diào),護(hù)照
if (requestCode == REQUEST_CODE_PASSPORT && resultCode == Activity.RESULT_OK) {
RecognizeService.recPassport(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),護(hù)照", result);
}
});
}
// 識別成功回調(diào),二維碼
if (requestCode == REQUEST_CODE_QRCODE && resultCode == Activity.RESULT_OK) {
RecognizeService.recQrcode(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),二維碼", result);
}
});
}
// 識別成功回調(diào),彩票
if (requestCode == REQUEST_CODE_LOTTERY && resultCode == Activity.RESULT_OK) {
RecognizeService.recLottery(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),彩票", result);
}
});
}
// 識別成功回調(diào),增值稅發(fā)票
if (requestCode == REQUEST_CODE_VATINVOICE && resultCode == Activity.RESULT_OK) {
RecognizeService.recVatInvoice(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),增值稅發(fā)票", result);
}
});
}
// 識別成功回調(diào),數(shù)字
if (requestCode == REQUEST_CODE_NUMBERS && resultCode == Activity.RESULT_OK) {
RecognizeService.recNumbers(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),數(shù)字", result);
}
});
}
// 識別成功回調(diào),手寫
if (requestCode == REQUEST_CODE_HANDWRITING && resultCode == Activity.RESULT_OK) {
RecognizeService.recHandwriting(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),手寫", result);
}
});
}
// 識別成功回調(diào),名片
if (requestCode == REQUEST_CODE_BUSINESSCARD && resultCode == Activity.RESULT_OK) {
RecognizeService.recBusinessCard(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),名片", result);
}
});
}
// 識別成功回調(diào),自定義模板
if (requestCode == REQUEST_CODE_CUSTOM && resultCode == Activity.RESULT_OK) {
RecognizeService.recCustom(this, FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
tvResult.setText("結(jié)果:" + result);
alertText("識別成功回調(diào),自定義模板", result);
}
});
}
}
/**
* 釋放資源
*/
@Override
protected void onDestroy() {
super.onDestroy();
// 釋放內(nèi)存資源
OCR.getInstance(this).release();
}
@Override
public void onClick(View view) {
Intent intent = null;
//檢測token是否成功獲取
if (!checkTokenStatus()) {
return;
}
switch (view.getId()) {
case R.id.btn:
//身份證識別
intent = new Intent(MainActivity.this, IDCardActivity.class);
startActivity(intent);
break;
case R.id.btn1:
//通用文字識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_GENERAL_BASIC);
break;
case R.id.btn2:
//二維碼識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_QRCODE);
break;
case R.id.btn3:
//網(wǎng)絡(luò)圖片文字識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_GENERAL_WEBIMAGE);
break;
case R.id.btn4:
//銀行卡識別
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_BANK_CARD);
startActivityForResult(intent, REQUEST_CODE_BANKCARD);
break;
case R.id.btn5:
//行駛證識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_VEHICLE_LICENSE);
break;
case R.id.btn6:
//駕駛證識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_DRIVING_LICENSE);
break;
case R.id.btn7:
//車牌識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_LICENSE_PLATE);
break;
case R.id.btn8:
//營業(yè)執(zhí)照識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_BUSINESS_LICENSE);
break;
case R.id.btn9:
//通用票據(jù)識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_RECEIPT);
break;
case R.id.btn10:
//護(hù)照識別
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_PASSPORT);
startActivityForResult(intent, REQUEST_CODE_PASSPORT);
break;
case R.id.btn11:
//數(shù)字識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_NUMBERS);
break;
case R.id.btn12:
//名片識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_BUSINESSCARD);
break;
case R.id.btn13:
//增值稅發(fā)票識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_VATINVOICE);
break;
case R.id.btn14:
//彩票識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_LOTTERY);
break;
case R.id.btn15:
//手寫識別
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_HANDWRITING);
break;
case R.id.btn16:
//自定義模板
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_GENERAL);
startActivityForResult(intent, REQUEST_CODE_CUSTOM);
break;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="身份證識別" />
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="通用文字識別" />
</LinearLayout>
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="15dp"
android:text="二維碼識別(失敗據(jù)說要創(chuàng)建工單開通權(quán)限有點(diǎn)麻煩)" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="網(wǎng)絡(luò)圖片文字識別" />
<Button
android:id="@+id/btn4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="銀行卡識別" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn5"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="行駛證識別" />
<Button
android:id="@+id/btn6"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="駕駛證識別" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="車牌識別(有時會失敗)" />
<Button
android:id="@+id/btn8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="營業(yè)執(zhí)照識別" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn9"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="通用票據(jù)識別" />
<Button
android:id="@+id/btn10"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="護(hù)照識別(容易檢測失敗)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn11"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="數(shù)字識別" />
<Button
android:id="@+id/btn12"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="名片識別(多次沒有成功)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn13"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="增值稅發(fā)票識別" />
<Button
android:id="@+id/btn14"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="彩票識別(多次沒有成功)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/btn15"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="手寫識別" />
<Button
android:id="@+id/btn16"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:padding="15dp"
android:text="自定義模板(不明白)" />
</LinearLayout>
<TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:text="Hello World!"
android:textSize="16sp" />
</LinearLayout>
package com.qy.myocrdemo.activity;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
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.IDCardParams;
import com.baidu.ocr.sdk.model.IDCardResult;
import com.baidu.ocr.ui.camera.CameraActivity;
import com.baidu.ocr.ui.camera.CameraNativeHelper;
import com.qy.myocrdemo.R;
import com.qy.myocrdemo.utils.FileUtil;
import java.io.File;
/**
* 身份證識別
*/
public class IDCardActivity 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_idcard);
alertDialog = new AlertDialog.Builder(this);
// 身份證正面拍照
findViewById(R.id.id_card_front_button).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_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
});
// 身份證正面掃描
findViewById(R.id.id_card_front_button_native).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設(shè)置了之后CameraActivity中不再自動初始化和釋放模型
// 請手動使用CameraNativeHelper初始化和釋放模型
// 推薦這樣做,可以避免一些activity切換導(dǎo)致的不必要的異常
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).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_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
});
// 身份證反面掃描
findViewById(R.id.id_card_back_button_native).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設(shè)置了之后CameraActivity中不再自動初始化和釋放模型
// 請手動使用CameraNativeHelper初始化和釋放模型
// 推薦這樣做,可以避免一些activity切換導(dǎo)致的不必要的異常
intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL,
true);
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
});
}
/**
* 彈出提示框
*
* @param title
* @param message
*/
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 void recIDCard(String idCardSide, String filePath) {
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
// 設(shè)置身份證正反面
param.setIdCardSide(idCardSide);
// 設(shè)置方向檢測
param.setDetectDirection(true);
// 設(shè)置圖像參數(shù)壓縮質(zhì)量0-100, 越大圖像質(zhì)量越好但是請求時間越長。 不設(shè)置則默認(rèn)值為20
param.setImageQuality(20);
OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null) {
alertText("", result.toString());
}
}
@Override
public void onError(OCRError error) {
alertText("", error.getMessage());
}
});
}
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;
}
@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);
}
}
}
}
}
@Override
protected void onDestroy() {
// 釋放本地質(zhì)量控制模型
CameraNativeHelper.release();
super.onDestroy();
}
}
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
-->
<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"
android:paddingLeft="@dimen/cardview_default_radius"
android:paddingTop="@dimen/cardview_default_radius"
android:paddingRight="@dimen/cardview_default_radius"
android:paddingBottom="@dimen/cardview_default_radius"
tools:context=".activity.IDCardActivity">
<Button
android:id="@+id/gallery_button_front"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="相冊選擇 正面"
android:visibility="gone"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/gallery_button_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="相冊選擇 反面"
android:visibility="gone"
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_front_button_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="身份證正面(本地質(zhì)量控制)"
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" />
<Button
android:id="@+id/id_card_back_button_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="身份證反面(本地質(zhì)量控制)"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/info_text_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
-->
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:fadingEdge="vertical"
style="@style/result_pop_scroll"
android:id="@+id/result_pop"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/result_pop_scrollinner"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/result_text"
/>
</LinearLayout>
</ScrollView>

到這里集成就完成了,有點(diǎn)爛,大家有需要的湊合看吧