将图像URI转换为File对象

时间:2016-05-19 10:54:59

标签: java android ibm-watson visual-recognition

我正在开发一个应用程序,其中我要求从SD卡中选择图像并发送到IBM Waston Visual Recognition服务以识别图像中的内容。我这样做..

...
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

1 个答案:

答案 0 :(得分:3)

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

这不是你consume content identified by a Uri的方式。之一:

  • 使用ContentResolveropenInputStream(),然后将InputStream传递到您的图书馆,或

  • 使用ContentResolveropenInputStream(),然后使用Java I / O将InputStream复制到您控制的某个文件,然后将File传递给你的图书馆