Android如何用阿里云的API进行身份证识别
准备工作:在libs下添加 alicloud-Android-apigateway-sdk-1.0.1.jar,commons-codec-1.10-1.jar
在build.gradle添加 compile'com.squareup.okhttp3:okhttp:3.4.1'
在onCreate,或者afterViews初始化API网关
private void initGatewaySdk() {
// 初始化API网关
ApiGatewayClient.init(getApplicationContext(), false);
}
调用拍照功能
private void getPhotoCard(){
final String status = Environment.getExternalStorageState();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_REQUEST_CODE);
}
if (status.equals(Environment.MEDIA_MOUNTED)) {
defaultPhotoAddress = PHOTO_DIR + "/" + getPhotoName();
PreferenceUtils.modifyStringValueInPreferences(CardActivity.this, Preferences.IMAGE_3, defaultPhotoAddress);
imageUri = Uri.fromFile(new File(defaultPhotoAddress));
Intent intentPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is capture
intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentPhoto, CAMERA_REQUEST_CODE);
} else {
Toast.makeText(CardActivity.this, "没有sd卡", Toast.LENGTH_SHORT).show();
}
}
可以对照片进行裁剪
private void cropImageUri(Uri desUri, int outputX, int outputY, int requestCode){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(desUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 5);
intent.putExtra("aspectY", 3);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, requestCode);
}
用base64上传照片
private void trygetCardNum() {
if (NetworkUtils.isConnectWithTip(this, "您未连接网络,无法获取数据")) {
LoadingUtil.show(this);
String imgBase64 = "";
try {
defaultPhotoAddress = PreferenceUtils.getStringValueInPreferences(this, Preferences.IMAGE_3);
File file = new File(defaultPhotoAddress);
byte[] content = new byte[(int) file.length()];
FileInputStream finputstream = new FileInputStream(file);
finputstream.read(content);
finputstream.close();
imgBase64 = new String(Base64.encodeBase64(content));
// imgBase64 = Base64Img.Bitmap2StrByBase64(bitmap);
if(imgBase64!=null||!imgBase64.equals("")){
PreferenceUtils.modifyStringValueInPreferences(CardActivity.this, Preferences.IMAGE_3, null);
}
} catch (IOException e) {
e.printStackTrace();
return;
}
// 获取服务
RpcService rpcService = ApiGatewayClient.getRpcService();
final ApiRequest apiRequest = new ApiRequest();
// 设置请求地址、Path及Method
apiRequest.setAddress("https://dm-51.data.aliyun.com");
apiRequest.setPath("/rest/160601/ocr/ocr_idcard.json");
apiRequest.setMethod(HttpMethod.POST);
// 按照文档设置二进制形式Body,支持设置Query参数、Header参数、Form形式Body
apiRequest.setStringBody("{\"inputs\":[{\"image\":{\"dataType\":50,\"dataValue\":\""+imgBase64+"\"},\"configure\":{\"dataType\":50,\"dataValue\":\"{\\\"side\\\":\\\"face\\\"}\"}}]}");
// 设置支持自签等形式的证书,如果服务端证书合法请勿设置该值,仅在开发测试或者非常规场景下设置。
apiRequest.setTrustServerCertificate(true);
// 设置超时
apiRequest.setTimeout(10000);
rpcService.call(apiRequest, new ApiResponseCallback() {
@Override
public void onSuccess(ApiResponse apiResponse) {
// 处理apiResponse
LoadingUtil.dismiss();
String s = apiResponse.getStringBody();
NumBean result = JSONObject.parseObject(s, NumBean.class);
String dataValue = result.getOutputs().get(0).getOutputValue().getDataValue();
DataValueBean dataValueBean = JSONObject.parseObject(dataValue, DataValueBean.class);
Number = dataValueBean.getNum();
name = dataValueBean.getName();
address = dataValueBean.getAddress();
birth = dataValueBean.getBirth();
nationality = dataValueBean.getNationality();
sex = dataValueBean.getSex();
if(dataValueBean.getError_msg()==null){
runOnUiThread(new Runnable() {
public void run() {
if(Number == null||Number.equals("")||name == null||name.equals("")||address == null||address.equals("")||birth == null||birth.equals("")||sex == null||sex.equals("")){
Toast.makeText(CardActivity.this, "扫描失败,请重试", Toast.LENGTH_LONG).show();
}else {
//扫描成功
}
}
});
}else {
errString = dataValueBean.getError_msg();
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(CardActivity.this, "扫描失败,请重试", Toast.LENGTH_LONG).show();
}
});
}
}
@Override
public void onException(ApiInvokeException e) {
// 处理异常
LoadingUtil.dismiss();
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(CardActivity.this, "扫描失败,请重试", Toast.LENGTH_LONG).show();
}
});
}
});
}
}
附:
public class NumBean implements Serializable{
private List<OutputsBean> outputs;
public List<OutputsBean> getOutputs() {
return outputs;
}
public void setOutputs(List<OutputsBean> outputs) {
this.outputs = outputs;
}
public static class OutputsBean {
private String outputLabel;
private OutputMultiBean outputMulti;
private OutputValueBean outputValue;
public String getOutputLabel() {
return outputLabel;
}
public void setOutputLabel(String outputLabel) {
this.outputLabel = outputLabel;
}
public OutputMultiBean getOutputMulti() {
return outputMulti;
}
public void setOutputMulti(OutputMultiBean outputMulti) {
this.outputMulti = outputMulti;
}
public OutputValueBean getOutputValue() {
return outputValue;
}
public void setOutputValue(OutputValueBean outputValue) {
this.outputValue = outputValue;
}
public static class OutputMultiBean {
}
public static class OutputValueBean {
private int dataType;
private String dataValue;
public int getDataType() {
return dataType;
}
public void setDataType(int dataType) {
this.dataType = dataType;
}
public String getDataValue() {
return dataValue;
}
public void setDataValue(String dataValue) {
this.dataValue = dataValue;
}
}
}
}
public class DataValueBean implements Serializable{
private String address;
private String birth;
private String config_str;
private String error_msg;
private String name;
private String nationality;
private String num;
private String request_id;
private String sex;
private boolean success;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
public String getConfig_str() {
return config_str;
}
public void setConfig_str(String config_str) {
this.config_str = config_str;
}
public String getError_msg() {
return error_msg;
}
public void setError_msg(String error_msg) {
this.error_msg = error_msg;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getRequest_id() {
return request_id;
}
public void setRequest_id(String request_id) {
this.request_id = request_id;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
在AndroidManifest.xml下添加 Appkey
<meta-data android:name="com.alibaba.apigateway.appKey" android:value="" />
<meta-data android:name="com.alibaba.apigateway.appSecret" android:value="" />
Android如何用阿里云的API进行身份证识别的更多相关文章
- C#调用阿里云CDN API刷新缓存
使用CDN必须要解决CDN缓存的问题,要么在每次更新文件时生成不同的URL,要么在每次更新文件时刷新CDN缓存.我们在一个实际应用场景中用到了后者,所以需要调用阿里云CDN的API进行缓存刷新的操作. ...
- nodejs版 阿里云开放api签名算法
阿里云 API 签名 github:https://github.com/liuyinglong/aliyun; npm :https://www.npmjs.com/package/aliyun-a ...
- 阿里云Open API自动化脚本—ECS公网IP转化弹性公网IP
1.OpenAPI Explorer 记录一下使用阿里云 Open API 自动化/脚本化 “ECS 公网 IP 转化弹性公网 IP”的实现 全过程.原博客地址:https://www.markedi ...
- 阿里云DNS api接口 shell 更改DNS解析
可定时任务检查域名解析,调用alidns.sh更新DNS解析 #!/bin/bash # alidns.sh #https://www.cnblogs.com/elvi/p/11663910.html ...
- C#-Api:身份证识别
ylbtech-C#-Api:身份证识别 通过POST上传base64格式的图片内容,可识别二代身份证.驾照.行驶证.军官证.中华人民共和国往来港澳通行证.台湾居民往来大陆通行证.大陆居民往来台湾通行 ...
- springmvc学习笔记--支持文件上传和阿里云OSS API简介
前言: Web开发中图片上传的功能很常见, 本篇博客来讲述下springmvc如何实现图片上传的功能. 主要讲述依赖包引入, 配置项, 本地存储和云存储方案(阿里云的OSS服务). 铺垫: 文件上传是 ...
- 基于阿里云 DNS API 实现的 DDNS 工具
0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿 ...
- 微信小程序里如何用阿里云上传视频,图片。。
纯手写,踩了半天多的坑干出来了... 网上也有对于阿里云如何在微信小程序里使用,但是很不全,包括阿里云文档的最佳实践里. 话不多说上代码了. upvideo(){ var aliOssParams = ...
- python 调用阿里云服务器api创建服务器
首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-ecs 可以配合jenkins传递参数 #!/u ...
随机推荐
- xunit inlinedata classdata memberdata
https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdat ...
- codeforces A. Kitahara Haruki's Gift 解题报告
题目链接:http://codeforces.com/problemset/problem/433/A 题目意思:给定 n 个只由100和200组成的数,问能不能分成均等的两份. 题目其实不难,要考虑 ...
- 【HDU 3555】 Bomb
[题目链接] 点击打开链接 [算法] 数位DP [代码] #include<bits/stdc++.h> using namespace std; #define MAXL 15 type ...
- 棋盘问题(dp)
棋盘问题 传送门 题目描述 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个 ...
- MongoDB之shard_副本集和分片部署
机器角色分配和拓扑环境如下: -------------------配置副本集s1-------------------------------1.创建目录在s1h1上创建如下目录[root@node ...
- 洛谷P2148 E&D——打表
题目:https://www.luogu.org/problemnew/show/P2148 先打表找个规律: #include<iostream> #include<cstdio& ...
- 【转】Intellij idea 的maven项目如何通过maven自动下载jar包
原文地址: https://blog.csdn.net/machao0903/article/details/73368909 maven项目自动加载jar包 所需工具如下: Intellij IDE ...
- Code-zabbix:zabbix-3.4-快速入门
ylbtech-Code-zabbix:zabbix-3.4-快速入门 1.返回顶部 1. 1 登陆和配置用户 登陆Zabbix,以及在Zabbix内建立一个系统用户. 用户名:Admin 或者 ad ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 06. Controller 返回View
Controller父类会提供很多上下文的相关信息,还提供了很多封装的方法 返回的对象要求实现了IActionResult接口 继承父类,并引入命名空间 写this点就出现很多东西,这些就是上下文的信 ...
- Swift3.0 元组 (tuples)
//元组 //不需要的元素用 _ 标记 let (name,age,_) = (","男") print(name,age) //通过下标访问特定的元素 let stud ...