Android getting pictures from photo's gallery - error on some devices

这一生的挚爱 提交于 2019-12-25 07:05:06

问题


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)

回答1:


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;

}



回答2:


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.



来源:https://stackoverflow.com/questions/34923702/android-getting-pictures-from-photos-gallery-error-on-some-devices

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!