1

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

Algor7
  • 149
  • 1
  • 14

1 Answers1

3
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

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • 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); } – Algor7 May 19 '16 at 14:41
  • But getting "java.io.FileNotFoundException: Image.jpg: open failed: EROFS (Read-only file system)". Definitely i am doing something wrong.. Please correct me. – Algor7 May 19 '16 at 14:42
  • @Algor7: That is not how you work with files on Android. You need to use a `File` object rooted in some specific directory (e.g., `getFilesDir()` called on a `Context`, like your `Activity`). So, replace `new File("Image.jpg")` with something like `new File(getFilesDir(), "Image.jpg")`. – CommonsWare May 19 '16 at 14:44
  • Please check the updated callIBMWatsonVisualRecognition() method on the post above. – Algor7 May 19 '16 at 14:45