这是一个吸猫文章的标题,甚至可以有两行这么多哦

语言: CN / TW / HK

theme: mk-cute

一起用代码吸猫!本文正在参与【喵星人征文活动】

前言

本篇文章采用百度识图api来实现对于动物的甄别,你还在为朋友炫猫你却不知道品种的尴尬场景吗?

流程

首先使用百度的识图api,我们就要注册相应的账号

https://ai.baidu.com/tech/imagerecognition/

image.png

注册完,你需要完成实名认证,然后进入控制台创建app

image.png

image.png

看到去领取了吗?进入白嫖点额度

image.png

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();
    }
}

} ```

好啦,一个简单的动物识别就结束了,看看效果

识别2.gif

非常nice,┏(^0^)┛