目录
一、简介
最近在学习实现Android的拍照AI识别功能,主要通过调用手机系统的摄像机来完成拍照,并通过网络服务访问百度智慧云上的图像识别api来进行识图,最后将识图结果返回到app中。我把这个功能分成两个部分,分别是拍摄和识别,这篇文章讲的是图像识别部分,想看拍摄部分分析请点击:Android拍摄并进行图像识别(一)_Super500000的博客-CSDN博客
二、程序流程图
三、核心代码分析
1.获取鉴权Token
private String getAccessToken() {
String token = SPUtils.getString(Constant.TOKEN, null, this);
if (token == null) {
//访问API获取接口
Log.d("Camera","执行至getAccessToken()");
requestApiGetToken();
} else {
//则判断Token是否过期
if (isTokenExpired()) {
//过期,再获取一次
requestApiGetToken();
} else {
accessToken = token;
}
}
return accessToken;
}
private void requestApiGetToken() {
String grantType = "client_credentials";
String apiKey = "A63XnnuZfncKbBpMpnnpL54P";
String apiSecret = "v2OmvaINWEw9tETlawLN62zYrYgjvCe";//应用匹配
service.getToken(grantType, apiKey, apiSecret)
.enqueue(new NetCallBack<GetTokenResponse>() {
@Override
public void onSuccess(Call<GetTokenResponse> call, Response<GetTokenResponse> response) {
if (response.body() != null) {
//鉴权Token
accessToken = response.body().getAccess_token();
//过期时间 秒
long expiresIn = response.body().getExpires_in();
//当前时间 秒
long currentTimeMillis = System.currentTimeMillis() / 1000;
//放入缓存
SPUtils.putString(Constant.TOKEN, accessToken, MainActivity.this);
SPUtils.putLong(Constant.GET_TOKEN_TIME, currentTimeMillis, MainActivity.this);
SPUtils.putLong(Constant.TOKEN_VALID_PERIOD, expiresIn, MainActivity.this);
}
}
@Override
public void onFailed(String errorStr) {
Log.d("Camera", "获取Token失败,失败原因:" + errorStr);
accessToken = null;
}
});
}
这里的apiKey和apiSecret是从百度智慧云的应用列表中负责的,每创建一个应用都会有一个独一无二的apiKey和apiSecret