Android getting pictures from photo's gallery

2019-09-17 21:35发布

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)

2条回答
唯我独甜
2楼-- · 2019-09-17 22:01
public static final int GALLERY_INTENT_REQUEST_CODE = 0x000005;

To open Gallery & get path of selected image use following code :

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 photoPickerIntent.setType("image/*");
 photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());        
 mActPanelFragment.startActivityForResult(photoPickerIntent, ActivityConstantUtils.GALLERY_INTENT_REQUEST_CODE);

After that you get path in onActivityResult() method

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
(requestCode == ActivityConstantUtils.GALLERY_INTENT_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
try {
            String imagePath = getFilePath(data);
            // TODO: Here you set data to preview screen
    }catch(Exception e){}
}
}

private String getFilePath(Intent data) {
    String imagePath;
    Uri selectedImage = data.getData();
    String[] filePathColumn = {MediaStore.Images.Media.DATA};

    Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    imagePath = cursor.getString(columnIndex);
    cursor.close();

    return imagePath;

}
查看更多
手持菜刀,她持情操
3楼-- · 2019-09-17 22:24

There is no requirement that ACTION_GET_CONTENT return to you a Uri from the MediaStore. 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 is null, 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 the Uri to the image and handle all the loading and resizing for you (on a background thread) and update your ImageView.

If you insist upon doing this yourself, fork a background thread, then use ContentResolver and methods like openInputStream() and getType(), along with BitmapFactory.

查看更多
登录 后发表回答