I have a function on my app which I open the photo's gallery and select an image to show in a ImageView. The weird thing is, on my Samsung Galaxy S5, the code work perfectly, but when I try on an ASUS Zenphone, or Motorola Moto X the code just doesn't work and the application crashes.
All the devices has the same Android version (5.0)
Here is my code samples:
Intent to open photo's gallery:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMG_SDCARD);
Activity Result:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
File file = null;
if(data != null && requestCode == IMG_SDCARD && resultCode == getActivity().RESULT_OK){
Uri img = data.getData();
String[] cols = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(img, cols, null, null, null);
cursor.moveToFirst();
int indexCol = cursor.getColumnIndex(cols[0]);
String imgString = cursor.getString(indexCol);
cursor.close();
file = new File(imgString);
if(file != null){
wd.getImage().setResizedBitmap(file, 1200, 700);
wd.getImage().setMimeFromImgPath(file.getPath());
}
}
if(wd.getImage().getBitmap() != null){
imageView.setImageBitmap(wd.getImage().getBitmap());
}
}
Would you guys have ever seen something like this?
Could have differences on getting images from the photo's gallery between the different devices?
EDIT
This is the log error:
01-21 10:34:01.066 30243-30243/com.inthecheesefactory.lab.designlibrary E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.inthecheesefactory.lab.designlibrary, PID: 30243
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65539, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:4904 flg=0x1 }} to activity {com.inthecheesefactory.lab.designlibrary/br.com.amais.viumeupet.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:3559)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3602)
at android.app.ActivityThread.access$1300(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1334)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference
at java.io.File.fixSlashes(File.java:179)
at java.io.File.<init>(File.java:128)
at br.com.amais.viumeupet.Fragment1.onActivityResult(Fragment1.java:285)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:153)
at br.com.amais.viumeupet.MainActivity.onActivityResult(MainActivity.java:231)
at android.app.Activity.dispatchActivityResult(Activity.java:6220)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3555)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3602)
at android.app.ActivityThread.access$1300(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1334)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
To open Gallery & get path of selected image use following code :
After that you get path in onActivityResult() method
There is no requirement that
ACTION_GET_CONTENT
return to you aUri
from theMediaStore
. Even if it does, there is no requirement that your code will give you a path to a file that you have read access to. In your case,imgString
isnull
, which is not terribly surprising.Instead, get rid of all of this (including whatever
wd
is) and use an image-loading library, like Picasso, that can just take theUri
to the image and handle all the loading and resizing for you (on a background thread) and update yourImageView
.If you insist upon doing this yourself, fork a background thread, then use
ContentResolver
and methods likeopenInputStream()
andgetType()
, along withBitmapFactory
.