0

Ich habe mir schon eine Weile das Hirn aufgerissen und würde es wirklich schätzen, wenn jemand einen Einblick in Dieses Problem könnte mir helfen!Watson Visual Recognition Fehler "Ungültige Bilddaten. Unterstützte Formate sind JPG, PNG und GIF" beim Hochladen von Bildern aus Android Studio

Ich versuche, ein Bild zu Watsons Visual Recognition API mit POST von Android Studio (durch Aufnahme eines Bildes mit einer Kamera) hochladen.

Ich habe geschaffen - Bild speichern, nachdem ein Bild mit einer Kamera nehmen - zeigen Sie es als Bitmap-Bild auf der App

und ich versuche, die Datei in dem Watson-API hochladen, aber ich halte immer diese Fehlermeldung

"description": "Ungültige Bilddaten Unterstützte Formate sind JPG, PNG, GIF und ."

Ich würde wirklich schätzen, wenn jemand einige Einblicke geben könnte, was ich hier falsch mache. Danke im Voraus!

I HttpURLConnection und Dataoutputstream bin mit jetzt POST und der Code ist wie folgt:

ImgName und imgPath sind alle richtig erkannt, und name = "images_file" ist, wie Watson von Visual Recognition API-Anfragen nennen

zu sein
public void uploadImage(){ 
    HttpURLConnection conn = null; 
    DataOutputStream dos = null; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 
    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1 * 1024 * 1024; 
    try{ 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

     StrictMode.setThreadPolicy(policy); 

     URL url = new URL("https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=APIKEY&version=2016-05-20"); 
     conn= (HttpURLConnection) url.openConnection(); 
     FileInputStream fileInputStream = new FileInputStream(file); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
     conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
     conn.setRequestProperty("images_file", imgPath); 

     dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"images_file\"; filename = \"" + imgName + "\"" + lineEnd); 
     dos.writeBytes(lineEnd); 


     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     buffer = new byte[bufferSize]; 

     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     while (bytesRead > 0) { 

      dos.write(buffer, 0, bufferSize); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

     } 

     // send multipart form data necesssary after file data... 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

     // Responses from the server (code and message) 
     serverResponseCode = conn.getResponseCode(); 
     String serverResponseMessage = conn.getResponseMessage(); 

     Log.i("uploadFile", "HTTP Response is : " 
       + serverResponseMessage + ": " + serverResponseCode); 

     if(serverResponseCode == 200){ 

      BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); 
      StringBuilder sb = new StringBuilder(); 
      String output; 
      while ((output = br.readLine()) !=null) { 
       sb.append(output); 
      } 
      Log.d("debugging", sb.toString()); 

      runOnUiThread(new Runnable() { 
       public void run() { 

        String msg = "File Upload Completed.\n\n See uploaded file here : \n\n" 
          +" http://www.androidexample.com/media/uploads/" 
          +imgName; 


        Toast.makeText(getApplicationContext(), "File Upload Complete.", 
          Toast.LENGTH_SHORT).show(); 


       } 
      }); 
     } 

     //close the streams // 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 

    } catch (MalformedURLException ex) { 

     ex.printStackTrace(); 

     runOnUiThread(new Runnable() { 
      public void run() { 
       Toast.makeText(getApplicationContext(), "MalformedURLException", 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
    } catch (Exception e) { 

     e.printStackTrace(); 

     runOnUiThread(new Runnable() { 
      public void run() { 
       Toast.makeText(getApplicationContext(), "Got Exception : see logcat ", 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     Log.e("Debugging", "Exception : " 
       + e.getMessage(), e); 
    } 
    Log.d("Debugging", "responseCode:" + serverResponseCode); 
} 

Antwort

1

Die visuelle Erkennung hat ein SDK (Client-Bibliothek) in Java. Sie müssen nur die Abhängigkeit zu Ihrem build.gradle hinzufügen.

compile 'com.ibm.watson.developer_cloud:java-sdk:3.2.0' 

Dann

VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20); 
service.setApiKey("<api-key>"); 

ClassifyImagesOptions options = new ClassifyImagesOptions.Builder() 
    .images(new File("car.png")) 
    .build(); 

VisualClassification result = service.classify(options) 
    .enqueue(new ServiceCallback<List<Dialog>>() { 
     @Override 
     public void onResponse(List<Dialog> response) { 
     System.out.println(response); 
     } 

     @Override 
     public void onFailure(Exception e) { 
     // on failure 
     }} 
); 

Diese example hat eine CameraHelper Klasse mit Utility-Methoden den Dateipfad oder Input eines Bildes in Android zu bekommen.

+1

oh mein Gott, es gab ein SDK dafür? Kann nicht glauben, dass ich es verpasst habe! Ich kann es jetzt nicht versuchen, aber ich bin mir ziemlich sicher, dass dieser Ansatz funktionieren wird, also werde ich es als Antwort trotzdem markieren - hoffe, es hilft jedem, der Probleme mit Watsons visueller Erkennung hat! –

0

Eine andere Sache zu überprüfen ist, dass imgName tatsächlich in einer dieser Erweiterungen endet - andernfalls wird das System es derzeit nicht akzeptieren.

Verwandte Themen