在我的应用程序中,我上传图片以获得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;
据我所知,您无法在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,您可能想要删除您使用的密钥。