2016-05-19 22 views
1

私は、SDカードから画像を選択し、IBM Waston Visual Recognitionサービスに送信して画像内のコンテンツを識別する必要があるアプリケーションを開発しています。私はこのようにやって..画像URIをFileオブジェクトに変換

... 
private VisualRecognition service; 
private VisualClassification result; 
... 

private void openImageFromSDCard(){ 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_FILE); 
} 

private void callIBMWatsonVisualRecognition(){ 

    try { 
     ContentResolver cr = this.getContentResolver(); 
     InputStream is = cr.openInputStream(image); 
     File file = new File("Image.jpg"); 
     FileOutputStream fr = new FileOutputStream(file); 
     int c; 
     while ((c = is.read()) != -1) { 
      fr.write(c); 
     } 
     result = service.classify(file).execute(); 
     tvResult.setText(result.toString()); 
     is.close(); 
     fr.close(); 
    }catch (Exception e){ 
     Log.d("THINK", "Error = " + e); 
    } 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK) { 

     if (requestCode == SELECT_FILE) { 

      image = data.getData(); 
      tvResult.setText(image.toString()); 
      imageSelectFlag = true; 

     } 
    } 
} 
... 

エラーしています:

java.lang.IllegalArgumentException: image cannot be null or not be found 
     at com.ibm.watson.developer_cloud.util.Validator.isTrue(Validator.java:38) 
     at com.ibm.watson.developer_cloud.visual_recognition.v2_beta.VisualRecognition.classify(VisualRecognition.java:152) 
     at com.ibm.watson.developer_cloud.visual_recognition.v2_beta.VisualRecognition.classify(VisualRecognition.java:124) 
     at com.algor7.watsonvisiondemo.MainActivity.callIBMWatsonVisualRecognition(MainActivity.java:75) 
     at com.algor7.watsonvisiondemo.MainActivity.onClick(MainActivity.java:57) 
     at android.view.View.performClick(View.java:5204) 
     at android.view.View$PerformClick.run(View.java:21153) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

VisualRecognitionとVisualClassificationクラスを確認してください(V2)here

答えて

3
File file = new File(image.toString()); 

どのようconsume content identified by a Uriされていないこと。次のいずれかの

  • ContentResolveropenInputStream()、その後あなたのライブラリーにInputStreamを渡す、または

  • ますいくつかのファイルにInputStreamことをコピーするには、Java I/Oを使用し、その後、ContentResolveropenInputStream()を使用を使用してください制御は、その後、私はこのようにそれをやっている、あなたの提案を1として

+0

あなたのライブラリーにそのFileを渡す... – Algor7

+0

試して{をContentResolver cr = this.getContentResolver(); InputStream is = cr.openInputStream(image); ファイルfile =新しいファイル( "Image.jpg"); FileOutputStream fr =新しいFileOutputStream(ファイル)。 int c; while((c = is.read())!= -1){ fr.write(c); } 結果= service.classify(ファイル).execute(); tvResult.setText(result.toString()); is.close(); fr.close(); } catch(例外e){ Log.d( "THINK"、 "Error =" + e); } – Algor7

+0

しかし、 "java.io.FileNotFoundException:Image.jpg:オープンに失敗しました:EROFS(読み取り専用ファイルシステム)"を取得しています。私は間違って何かをしています。私を修正してください。 – Algor7

関連する問題