这是一个吸猫文章的标题,甚至可以有两行这么多哦
theme: mk-cute
一起用代码吸猫!本文正在参与【喵星人征文活动】。
前言
本篇文章采用百度识图api来实现对于动物的甄别,你还在为朋友炫猫你却不知道品种的尴尬场景吗?
流程
首先使用百度的识图api,我们就要注册相应的账号
https://ai.baidu.com/tech/imagerecognition/
注册完,你需要完成实名认证,然后进入控制台创建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^)┛
- 学习Android的第十七天
- 这是一个吸猫文章的标题,甚至可以有两行这么多哦
- 学习Android的第四天
- 学习Android的第一天
- 含有边框的TextView-Android
- 电池-Android
- 倒计时封装-Android
- 标题和状态栏滑动渐变(2)-Android
- 标题和状态栏滑动渐变(1)-Android
- 关于选项卡三方库FlycoTabLayout的使用及修改
- 关于第三方库SmartTabLayout的一点小修改
- 关于递归反转链表的思路
- 搜索历史记录的实现-Android
- 感觉让人耳目一新的动画库Lottie
- Android-关于设备唯一ID的奇技淫巧
- 稍微巧妙的双模块联动-ViewPager
- 动画库NineOldAndroids实战自定义悬浮窗
- 关于项目中圆角及特殊圆角的实际使用问题
- 自定义TextView可控制Drawable大小