Search code examples
javaandroidibm-watsonvisual-recognition

Convert image URI into File object


I am developing an app in which my requirement to select an image from the SD card and send in to IBM Waston Visual Recognition service to identify the content in the image. I am doing like this..

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

        }
    }
}
...

Error :

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)

Please check VisualRecognition and VisualClassification classes(v2) here


Solution

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

    That is not how you consume content identified by a Uri. Either:

    • Use a ContentResolver and openInputStream(), then pass the InputStream into your library, or

    • Use a ContentResolver and openInputStream(), then use Java I/O to copy that InputStream to some file that you control, then pass that File into your library