使用Google Cloud Vision Face Detection API时出错

问题描述 投票:0回答:1

在我的应用程序中,我上传图片以获得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的响应,当我在网络浏览器中粘贴该网址时我发现错误,因为找不到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;
java android filenotfoundexception google-cloud-vision
1个回答
0
投票

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

您可以使用api密钥或OAUTH 2.0服务帐户访问云视觉URL

无论哪种方式,您都需要在帖子请求中提供这些凭据。

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

您的图片网址是公共网址,或者是公开的GCS网址,或者您的凭据可以访问。

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

在我看来,您使用的是API KEY而不是OAUTH 2.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,您可能想要删除您使用的密钥。

© www.soinside.com 2019 - 2024. All rights reserved.