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

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

前言

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

流程

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

ai.baidu.com/tech/imager…

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^)┛

猜你喜欢

转载自juejin.im/post/7032600028908617742