一起用代码吸猫!本文正在参与【喵星人征文活动】。
前言
本篇文章采用百度识图api来实现对于动物的甄别,你还在为朋友炫猫你却不知道品种的尴尬场景吗?
流程
首先使用百度的识图api,我们就要注册相应的账号
注册完,你需要完成实名认证,然后进入控制台创建app
看到去领取了吗?进入白嫖点额度
APIKey和Secret Key是我们一会要用的的,先保存到一个地方
Code
然后开始撸代码
首先当然是看文档操作了,第一步先获取token,这个操作类是百度官方提供的,我们就不整花活,直接使用即可
/**
* 获取token类
*/
public class AuthService {
/**
* 获取权限token
* @return 返回示例:
* {
* "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
* "expires_in": 2592000
* }
*/
public static String getAuth() {
// 官网获取的 API Key 更新为你注册的
String clientId = "--------------";
// 官网获取的 Secret Key 更新为你注册的
String clientSecret = "--------------";
return getAuth(clientId, clientSecret);
}
/**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Securet Key
* @return assess_token 示例:
* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
*/
public static String getAuth(String ak, String sk) {
// 获取token地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果示例
*/
Log.e("TAG", "getAuth: "+result);
JSONObject jsonObject = new JSONObject(result);
String access_token = jsonObject.getString("access_token");
return access_token;
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return null;
}
}
复制代码
其次当然是创建一个Activity了
//识别Activity,多么的见名知意
public class SBActivity extends AppCompatActivity {
private static final int CHOOSE_FILE_CODE = 200;
private ImageView mIvSelect;
private Button mBtnGetimg;
private TextView mTvResult;
private String auth;
private String param;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sbactivity);
initView();
}
private void initView() {
//子线程请求,不然会获取不到
new Thread(new Runnable() {
@Override
public void run() {
auth = AuthService.getAuth();
}
}).start();
//初始化布局
mIvSelect = findViewById(R.id.iv_select);
mBtnGetimg = findViewById(R.id.btn_getimg);
mTvResult = findViewById(R.id.tv_result);
//点击启动文件管理器,主要获取图片
mBtnGetimg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTvResult.setText("");
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*").addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, "Choose File"), CHOOSE_FILE_CODE);
} catch (ActivityNotFoundException e) {
Toast.makeText(SBActivity.this, "没~有~管~理~器~", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
// 文件选择完之后,自动调用此函数
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CHOOSE_FILE_CODE) {
if(data!=null){
//先将获取的图片设置到iamgeview上
mIvSelect.setImageURI(data.getData());
//然后通过噼里啪啦的操作获取到绝对路径
String path = FileUtils.getPath(SBActivity.this, data.getData());
Log.e("TAG", "onActivityResult: "+path);
//最后通过此方法请求数据
sb(path);
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private void sb(String path) {
// 请求url
String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal";
try {
//获取文件的字节流
byte[] bytes = FileUtil.readFileByBytes(path);
//转
String imgStr = Base64Util.encode(bytes);
//我再转
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
//拼接参数
param = "image=" + imgParam;
} catch (Exception e) {
e.printStackTrace();
}
try {
//设置回调
HttpUtil.setCallBack(new HttpUtil.CallBack() {
@Override
public void call(String data) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//切换主线程,将识别到的数据设置到textview上
mTvResult.setText(data);
}
});
}
});
//子线程请求结果
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpUtil.post(url, auth, param);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
好啦,一个简单的动物识别就结束了,看看效果
非常nice,┏(^0^)┛