一.AKSK初始化
二.代码的调用
public class MainActivity extends BaseActivity {
@BindView(R.id.tv)
TextView textView;
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
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void doBusiness() {
initPermission();
}
private void initPermission() {
AndPermission.with(this).runtime().permission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA).onDenied(data -> {
/*禁止权限集合*/
LogUtils.file("\n禁止权限集合:" + Arrays.toString(data.toArray()));
}).start();
}
@OnClick({R.id.drivinglicense, R.id.driverlicense, R.id.bankcard, R.id.auto_idcard, R.id.auto_idcard_back, R.id.idcard_back, R.id.idcard})
public void onClick(View v) {
switch (v.getId()) {
//行驶证
case R.id.drivinglicense:
Intent intent = new Intent(MainActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intent, REQUEST_CODE_VEHICLE_LICENSE);
break;
//驾驶证
case R.id.driverlicense:
Intent intent1 = new Intent(MainActivity.this, CameraActivity.class);
intent1.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent1.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intent1, REQUEST_CODE_DRIVING_LICENSE);
break;
//银行卡
case R.id.bankcard:
Intent intent2 = new Intent(MainActivity.this, CameraActivity.class);
intent2.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent2.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_BANK_CARD);
startActivityForResult(intent2, REQUEST_CODE_CAMERA);
break;
//身份证正面(自动识别)
case R.id.auto_idcard:
Intent intent3 = new Intent(MainActivity.this, CameraActivity.class);
intent3.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent3.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
//KEY_NATIVE_MANUAL设置了之后CameraActivity中不再自动初始化和释放模型
//请手动使用CameraNativeHelper初始化和释放模型,推荐这样做,可以避免一些activity切换导致的不必要的异常
intent3.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true);
intent3.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
startActivityForResult(intent3, REQUEST_CODE_CAMERA);
break;
//身份证反面(自动识别)
case R.id.auto_idcard_back:
Intent intent4 = new Intent(MainActivity.this, CameraActivity.class);
intent4.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent4.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
intent4.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true);
intent4.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
startActivityForResult(intent4, REQUEST_CODE_CAMERA);
break;
//身份证反面
case R.id.idcard_back:
Intent intent5 = new Intent(MainActivity.this, CameraActivity.class);
intent5.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent5.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
startActivityForResult(intent5, REQUEST_CODE_CAMERA);
break;
//身份证正面
case R.id.idcard:
Intent intent6 = new Intent(MainActivity.this, CameraActivity.class);
intent6.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile());
intent6.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
startActivityForResult(intent6, REQUEST_CODE_CAMERA);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String filePath = (String) SPUtils.get("temp", "");
if (requestCode == REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) {
if (data != null) {
String contentType = data.getStringExtra(CameraActivity.KEY_CONTENT_TYPE);
if (!TextUtils.isEmpty(contentType)) {
switch (contentType) {
case CameraActivity.CONTENT_TYPE_ID_CARD_FRONT://身份证正面
recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, filePath);
break;
case CameraActivity.CONTENT_TYPE_ID_CARD_BACK://身份证背面
recIDCard(IDCardParams.ID_CARD_SIDE_BACK, filePath);
break;
case CameraActivity.CONTENT_TYPE_BANK_CARD://银行卡
recCreditCard(filePath);
break;
}
}
}
}
if (requestCode == REQUEST_CODE_VEHICLE_LICENSE && resultCode == Activity.RESULT_OK) {//行驶证
recVehicleCard(filePath);
}
if (requestCode == REQUEST_CODE_DRIVING_LICENSE && resultCode == Activity.RESULT_OK) {//驾驶证
recDrivingCard(filePath);
}
}
/**
* @author Longchengbin
* @description 银行卡解析
* @since 2020-12-1 09:17
* @param filePath 需要识别图片的路径
**/
private void recCreditCard(String filePath) {
BankCardParams param = new BankCardParams();// 银行卡识别参数设置
param.setImageFile(new File(filePath));
BaseDialog dialog = new WaitDialog.Builder(this).setMessage("正在识别银行卡").show();
// 调用银行卡识别服务
OCR.getInstance(this).recognizeBankCard(param, new OnResultListener<BankCardResult>() {
@Override
public void onResult(BankCardResult result) {
dialog.dismiss();
if (result != null) {
String type;
if (result.getBankCardType() == BankCardResult.BankCardType.Credit) {
type = "信用卡";
} else if (result.getBankCardType() == BankCardResult.BankCardType.Debit) {
type = "借记卡";
} else {
type = "不能识别";
}
textView.setText(getString(R.string.bankcardresult,
(!TextUtils.isEmpty(result.getBankCardNumber()) ? result.getBankCardNumber() : ""),
(!TextUtils.isEmpty(result.getBankName()) ? result.getBankName() : ""), type));
}
}
@Override
public void onError(OCRError error) {
dialog.dismiss();
LogUtils.e("银行卡失败原因:" + error.getMessage());
}
});
}
/**
* @author Longchengbin
* @description 身份证解析
* @since 2020-12-1 09:19
* @param idCardSide 身份证的正/反面
* @param filePath 需要识别图片的路径
**/
private void recIDCard(String idCardSide, String filePath) {
BaseDialog dialog = new WaitDialog.Builder(this).setMessage("正在解析身份证").show();
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
param.setIdCardSide(idCardSide);// 设置身份证正反面
param.setDetectDirection(true);// 设置方向检测
// 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
param.setImageQuality(22);
OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
dialog.dismiss();
LogUtils.i("身份扫描结果:" + result.toString());
if (idCardSide.equals(IDCardParams.ID_CARD_SIDE_FRONT)) {
String name = "";
String sex = "";
String nation = "";
String num = "";
String address = "";
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();
}
textView.setText(getString(R.string.idcardresult, name, sex, nation, num, address));
} else {
textView.setText(getString(R.string.idcardbackresult, result.getSignDate(), result.getExpiryDate(),
result.getIssueAuthority()));
}
}
@Override
public void onError(OCRError error) {
dialog.dismiss();
LogUtils.e("身份证识别出错:" + error.getMessage());
textView.setText(getString(R.string.idcarderror, error.getMessage()));
}
});
}
//驾驶证解析
private void recDrivingCard(String filePath) {
OcrRequestParams param = new OcrRequestParams();// 识别参数设置
param.setImageFile(new File(filePath));// 设置image参数
param.putParam("detect_direction", true);// 设置其他参数
BaseDialog dialog = new WaitDialog.Builder(this).setMessage("正在解析驾驶证").show();
// 调用驾驶证识别服务
OCR.getInstance(this).recognizeDrivingLicense(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
// 调用成功,返回OcrResponseResult对象
dialog.dismiss();
LogUtils.w("驾驶证返回的数据:" + result.getJsonRes());
textView.setText(result.getJsonRes());
}
@Override
public void onError(OCRError error) {
dialog.dismiss();
LogUtils.e("驾驶证失败原因:" + error.getMessage());
}
});
}
//解析行驶证
private void recVehicleCard(String filePath) {
// LogUtils.i("路径:" + filePath);
OcrRequestParams param = new OcrRequestParams();
param.setImageFile(new File(filePath));
BaseDialog dialog = new WaitDialog.Builder(this).setMessage("正在解析行驶证").show();
OCR.getInstance(this).recognizeVehicleLicense(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
textView.setText(result.getJsonRes());
dialog.dismiss();
LogUtils.w("行驶证返回的数据:" + result.getJsonRes());
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
dialog.dismiss();
LogUtils.e("行驶证失败原因:" + error.getMessage());
}
});
}
}