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