Android从照片库中获取图片 - 在某些设备上出错

问题描述 投票:0回答:2

我在我的应用程序上有一个功能,我打开照片的图库并选择要在ImageView中显示的图像。奇怪的是,在我的三星Galaxy S5上,代码工作得很好,但是当我尝试使用华硕Zenphone或摩托罗拉Moto X代码时,代码无效,应用程序崩溃。 所有设备都具有相同的Android版本(5.0)

这是我的代码示例:

意图打开照片库:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMG_SDCARD);

活动结果:

@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());
    }
}

你们有没见过这样的东西? 在不同设备之间从照片库中获取图像可能会有差异吗?

编辑 这是日志错误:

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)
android image android-sdcard mobile-devices
2个回答
1
投票
public static final int GALLERY_INTENT_REQUEST_CODE = 0x000005;

要打开图库并获取所选图像的路径,请使用以下代码:

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

之后,您将获得onActivityResult()方法中的路径

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

}

1
投票

没有要求ACTION_GET_CONTENTUri返回给你一个MediaStore。即使它确实如此,也不要求您的代码为您提供一个您具有读取权限的文件的路径。在你的情况下,imgStringnull,这不是非常令人惊讶。

相反,摆脱所有这一切(包括wd是什么)并使用image-loading library,如Picasso,可以将Uri带到图像并处理所有加载和调整大小(在后台线程)并更新你的ImageView

如果你坚持自己这样做,请分叉背景线程,然后使用ContentResolveropenInputStream()getType()等方法以及BitmapFactory

© www.soinside.com 2019 - 2024. All rights reserved.