【问题标题】:Error occurs while using Google Cloud Vision Face Detection API使用 Google Cloud Vision 人脸检测 API 时出错
【发布时间】:2019-03-08 12:40:12
【问题描述】:

在我的应用程序中,我正在上传图片以从 Google Cloud Vision API 获取情绪响应。但是在将捕获的图像发送到云端时,我收到了错误

错误

401-1982/com.emotionrecognition W/System.err: java.io.FileNotFoundException: https://vision.googleapis.com/v1/images:annotate?key=AIzaSyAbr--TMSjNERLbwHB4p6a0EnYvVaFlqus
03-08 16:30:41.588 1401-1982/com.emotionrecognition W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:255)
03-08 16:30:41.588 1401-1982/com.emotionrecognition W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
03-08 16:30:41.588 1401-1982/com.emotionrecognition W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(Unknown Source:0)
03-08 16:30:41.588 1401-1982/com.emotionrecognition W/System.err:     at com.emotionrecognition.CloudVision.send(CloudVision.java:81)
03-08 16:30:41.589 1401-1982/com.emotionrecognition W/System.err:     at com.emotionrecognition.DetectedEmotionAnalysis$DetectEmotion.doInBackground(DetectedEmotionAnalysis.java:177)
03-08 16:30:41.589 1401-1982/com.emotionrecognition W/System.err:     at com.emotionrecognition.DetectedEmotionAnalysis$DetectEmotion.doInBackground(DetectedEmotionAnalysis.java:172)
03-08 16:30:41.589 1401-1982/com.emotionrecognition W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:333)
03-08 16:30:41.589 1401-1982/com.emotionrecognition W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
03-08 16:30:41.589 1401-1982/com.emotionrecognition W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
03-08 16:30:41.590 1401-1982/com.emotionrecognition W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
03-08 16:30:41.590 1401-1982/com.emotionrecognition W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
03-08 16:30:41.590 1401-1982/com.emotionrecognition W/System.err:     at java.lang.Thread.run(Thread.java:764)
03-08 16:30:41.590 1401-1982/com.emotionrecognition D/GCV Error: java.io.FileNotFoundException: https://vision.googleapis.com/v1/images:annotate?key=AIzaSyAbr--TMSjNERLbwHB4p6a0EnYvVaFlqus
03-08 16:30:55.951 1401-1401/com.emotionrecognition V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@8a9b4a4 nm : com.emotionrecognition ic=null
03-08 16:30:55.952 1401-1401/com.emotionrecognition I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus

这是我编写的用于将图像发送到 URL 的代码,我没有收到来自 Google Cloud Vision API 的响应,当我将该 URL 粘贴到网络浏览器中时,我收到错误,因为找不到 404 文件

 Bitmap bmp = BitmapFactory.decodeFile(imagePath);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] imageByteArray = stream.toByteArray();

            String encodedImageString = Base64.encodeToString(imageByteArray, Base64.DEFAULT);

            URL url = new URL(Config.CLOUD_VISION_URL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            con.setUseCaches(false);
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json");

            // Features JSON
            JSONObject featuresJson = new JSONObject();
            featuresJson.put("type", "FACE_DETECTION");
            featuresJson.put("maxResults", 1);

            JSONArray featuresJSONArray = new JSONArray();
            featuresJSONArray.put(featuresJson);

            // Image JSON
            JSONObject imageJson = new JSONObject();
            imageJson.put("content", encodedImageString);

            // Requests JSON
            JSONObject requestsJson = new JSONObject();
            requestsJson.put("image", imageJson);
            requestsJson.put("features", featuresJSONArray);

            JSONArray requestsJSONArray = new JSONArray();
            requestsJSONArray.put(requestsJson);

            JSONObject wholeRequest = new JSONObject();
            wholeRequest.put("requests", requestsJSONArray);

            OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
            out.write(wholeRequest.toString());

            out.flush();
            out.close();

            int response_code = con.getResponseCode();
            Log.d("GCV Response Code", ""+response_code);

            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder("");
            String temp;
            while((temp = br.readLine()) != null)
                sb.append(temp);
            String response = sb.toString();

            JSONObject responseJSONObject = new JSONObject(response);

            if (response_code == 200) {
                Log.d("GCV", "Successful response");
            }

            JSONArray responsesArray = responseJSONObject.getJSONArray("responses");
            JSONObject faceAnnotationsJson = responsesArray.getJSONObject(0);
            JSONObject annotedEmotionsJson = faceAnnotationsJson.getJSONArray("faceAnnotations").getJSONObject(0);
            return annotedEmotionsJson;

【问题讨论】:

  • 说找不到你上传的图片
  • 图片上传成功,但是当我在 chrome 中打印 cloud vision url 时出现 404 错误
  • 您能否向我们展示您正在处理的问题中的一些代码以进一步检查此问题?

标签: java android filenotfoundexception google-cloud-vision


【解决方案1】:

据我所知,您无法在 chrome 中打印云视觉 url,因为它需要您的凭据才能访问。

您可以使用 api_key 或 OATH2.0 服务帐号访问云视觉网址

无论采用哪种方式,您都需要在发布请求中提供这些凭据。

另一件事是您需要确保 Vision API 可以访问您的图片网址。

您的图片 url 要么是公共 http url,要么是 GCS url,要么是公共的,要么可以通过您的凭据访问。

或者您可以直接发送图像字节。

在我看来,您使用的是 API_KEY 而不是 OATH2.0 凭据

401-1982/com.emotionrecognition W/System.err:java.io.FileNotFoundException:https://vision.googleapis.com/v1/images:annotate?key=AIzaSyAbr--TMSjNERLbwHB4p6a0EnYvVaFlqus

您是否正在将图像上传到您的私有 GCS 存储桶?如果是这样,我建议您将您的图片标记为公开图片,然后重试。

据我所知,api_key 不能用于访问私有 GCS 存储桶。

并且不建议直接粘贴您的 api_key,您可能需要删除您使用的那个密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 2020-03-06
    • 2019-04-08
    • 2021-11-10
    • 2019-09-02
    • 2017-06-07
    • 2021-11-18
    • 2023-03-22
    相关资源
    最近更新 更多