Android端直接调用
视觉智能开放平台的API接口推荐使用SDK进行调用,因为调用需要使用AccessKey ID和AccessKey Secret,推荐在服务端进行接入,在客户端直接接入有AccessKey ID和AccessKey Secret泄漏风险,请自行评估风险范围。
阿里云视觉智能开放平台各类目视觉AI能力API接入、接口使用或问题咨询等,请通过钉钉群(23109592)加入阿里云视觉智能开放平台咨询群联系我们。
配置环境变量
配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户。
请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
Linux和macOS系统配置方法
在IntelliJ IDEA中打开终端Terminal。
执行以下命令,配置环境变量。
<access_key_id>
需替换为您RAM用户的AccessKey ID,<access_key_secret>
替换为您RAM用户的AccessKey Secret。如果后续需要进行更多权限相关的配置,具体操作请参见使用RAM Policy控制访问权限。export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
Windows系统配置方法
新建环境变量文件,添加环境变量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并写入已准备好的AccessKey ID和AccessKey Secret。然后重启Windows系统。本操作以Windows 10为例进行说明。打开文件资源管理器,在此电脑上右键单击属性。
在右侧导航栏,单击高级系统配置。
在系统属性对话框的高级页签下,单击环境变量。
在环境变量对话框中,单击新建(W)。
在弹出的新建系统变量对话框中,添加环境变量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并写入已准备好的AccessKey ID和AccessKey Secret。重启Windows系统,使配置生效。
SDK示例
使用Android端直接调用,可以参考Java SDK调用,支持本地文件和任意URL。
由于安卓存在线程机制,不能在主线程直接发起调用,请在子线程调用。
本文以银行卡识别(RecognizeBankCard)为例,仅展示关键步骤和代码,完整的示例可下载AndroidDemo。您如果调用其他算法,请参考注释和实际业务修改相应代码。
在应用的build.gradle文件中添加依赖。
// 1、see https://help.aliyun.com/document_detail/153132.html for sdk implementation("com.aliyun:ocr20191230:1.0.23") { exclude group: 'xml-apis', module: 'xml-apis' exclude group: 'dom4j', module: 'dom4j' }
说明本文以银行卡识别(RecognizeBankCard)为例,因此引入了ocr包,您需要根据自己的实际业务引入Java SDK包。Java SDK包的详情,请参见Java SDK。
初始化Client。
/* 2、初始化配置对象com.aliyun.teaopenapi.models.Config Config对象存放 AccessKeyId、AccessKeySecret、endpoint等配置 */ Config config = new Config() // 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。 // 如果您使用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。 // 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。 .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) // 您的 AccessKey Secret .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // 3、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html config.endpoint = "ocr.cn-shanghai.aliyuncs.com"; // client为类成员变量 client = new Client(config)
调用API。
场景一:文件在同地域OSS
/**
* 文件在同地域OSS,调用API,以RecognizeBankCard为例。
* @param view
*/
public void callApiShanghaiOss(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Log.d(TAG, String.format("begin callApi: %s %s", "RecognizeBankCard", "http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg"));
// 4、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
com.aliyun.ocr20191230.models.RecognizeBankCardRequest recognizeBankCardRequest = new com.aliyun.ocr20191230.models.RecognizeBankCardRequest()
.setImageURL("http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
// 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,recognizeBankCardWithOptions方法名也需要改成对应能力的方法名
RecognizeBankCardResponse resp = client.recognizeBankCardWithOptions(recognizeBankCardRequest, runtime);
// 获取整体结果。部分能力会输出url链接,通过toJSONString转换后可能有编码问题,但是通过单个字段获取是没问题的。
Log.d(TAG, String.format("%s", com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(resp))));
// 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
Log.d(TAG, String.format("%s", resp.getBody().getData().getCardNumber()));
showToastMsg("调用成功,银行卡号:" + resp.getBody().getData().getCardNumber());
} catch (com.aliyun.tea.TeaException teaException) {
Log.d(TAG, "teaException.getCode(): " + teaException.getCode());
// 请处理Exception
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
}
}).start();
此场景需要APP访问网络的权限,请确保已配置APP访问网络的权限。
场景二:文件在本地
/**
* 文件在本地,调用API,以RecognizeBankCard为例。
* @param view
*/
public void callApiLocal(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// filePath请改成您的真实文件路径
String filePath = "resource/test_images/yhk1.jpg";
Log.d(TAG, String.format("begin callApi: %s %s", "RecognizeBankCard", filePath));
// 使用文件,文件通过inputStream传入接口。这里只是演示了assets下的文件如何转为stream,如果文件来自其他地方,如sdcard或者摄像头,请自行查看android开发文档或教程将文件转为stream之后传入。
InputStream inputStream = MainActivity.this.getAssets().open(filePath);
// 4、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
com.aliyun.ocr20191230.models.RecognizeBankCardAdvanceRequest recognizeBankCardAdvanceRequest = new com.aliyun.ocr20191230.models.RecognizeBankCardAdvanceRequest()
.setImageURLObject(inputStream);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
// 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,recognizeBankCardAdvance方法名也需要改成对应能力的方法名
RecognizeBankCardResponse resp = client.recognizeBankCardAdvance(recognizeBankCardAdvanceRequest, runtime);
// 获取整体结果。部分能力会输出url链接,通过toJSONString转换后可能有编码问题,但是通过单个字段获取是没问题的。
Log.d(TAG, String.format("%s", com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(resp))));
// 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
Log.d(TAG, String.format("%s", resp.getBody().getData().getCardNumber()));
showToastMsg("调用成功,银行卡号:" + resp.getBody().getData().getCardNumber());
} catch (com.aliyun.tea.TeaException teaException) {
Log.d(TAG, "teaException.getCode(): " + teaException.getCode());
// 请处理Exception
} catch (java.io.FileNotFoundException e) {
showToastMsg("文件找不到,请检查代码中的filePath路径是否正确");
Log.e(TAG, e.getMessage());
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
}
}).start();
}
此场景需要APP访问网络和本地文件的权限,请在确保已配置APP访问网络和本地文件的权限。
场景三:文件不在同一地域 OSS
/**
* 文件在任意URL,调用API,以RecognizeBankCard为例。
* @param view
*/
public void callApiAnyUrl(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Log.d(TAG, String.format("begin callApi: %s %s", "RecognizeBankCard", "https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg"));
// 使用任意URL
URL url = new URL("https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg");
InputStream inputStream = url.openConnection().getInputStream();
// 4、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
com.aliyun.ocr20191230.models.RecognizeBankCardAdvanceRequest recognizeBankCardAdvanceRequest = new com.aliyun.ocr20191230.models.RecognizeBankCardAdvanceRequest()
.setImageURLObject(inputStream);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
// 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,recognizeBankCardAdvance方法名也需要改成对应能力的方法名
RecognizeBankCardResponse resp = client.recognizeBankCardAdvance(recognizeBankCardAdvanceRequest, runtime);
// 获取整体结果。部分能力会输出url链接,通过toJSONString转换后可能有编码问题,但是通过单个字段获取是没问题的。
Log.d(TAG, String.format("%s", com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(resp))));
// 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
Log.d(TAG, String.format("%s", resp.getBody().getData().getCardNumber()));
showToastMsg("调用成功,银行卡号:" + resp.getBody().getData().getCardNumber());
} catch (com.aliyun.tea.TeaException teaException) {
Log.d(TAG, "teaException.getCode(): " + teaException.getCode());
// 请处理Exception
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
}
}).start();
}
此场景需要APP访问网络并且需要支持访问HTTP链接的权限,请确保已配置APP访问网络的权限并支持访问HTTP链接。
完整工程仅以银行卡识别(RecognizeBankCard)为例,如果调用其他算法,请参考注释进行相应代码修改。
修改点可参见Java SDK,总结如下:
引入包的时候,需要引入相应类目的包和相关类。包括build.gradle中的com.aliyun:ocr20191230:1.0.23和MainActivity.java中import。包名可参考Java SDK包名称,能力名称可参考对应API文档中的Action参数。
例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错
InvalidAction.NotFound
。关于域名详情,请参见访问域名。Request和Response需要使用相应类目的包和类。
调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,文件在同地域OSS对应方法名应该为segmentCommonImageWithOptions,文件在本地或者不在同一地域 OSS对应方法名应该为segmentCommonImageAdvance。