从Android 5.1相册中选择图片

3
我正在使用标准的android从图库选择图片的方法从手机中选择图片。我的代码在所有安卓系统上都完美运行,除了5.0及更高版本的安卓系统。
我进行了一些调试,问题似乎出在以下部分:
public String getPath (Uri uri) {

    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

    cursor.moveToFirst();
    ImagePath=  cursor.getString(column_index) ;

    System.out.println("HERE" + ImagePath);   // returns null
    return cursor.getString(column_index);
 }

我的println返回了null,这是问题所在。除了5.0+的Android系统之外,其他系统都没有返回null。我该如何解决这个问题?


我也注意到了这个问题。似乎Android 5.0破坏了DATA列。最好能得到一个真正解决这个问题的答案... - James
3个回答

0

尝试:

String imagePath = cursor.getString(cursor.getColumnIndex(projection[0]));

0
你应该使用 `startActivityForResult` 和 `onActivityResult`。 小技巧:
    Intent pickPicIntent = new Intent();
    // pickPicIntent.setDataAndType(
    // MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    pickPicIntent.setType("image/*");
    pickPicIntent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(pickPicIntent, CODE_PICK_PICTURE);

然后:

    Bundle extras = data.getExtras();
    if (extras != null) {
        Bitmap photo = extras.getParcelable("data");
        // civAvatar.setImageBitmap(photo); 
        FileOutputStream fos = null;
        try {
            // Store Bitmap into a File
            fos = new FileOutputStream(AVATAR_FILE);
            photo.compress(Bitmap.CompressFormat.PNG, 100, fos);
            AVATAR_FILE_TMP.deleteOnExit();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            IoUtils.closeSilently(fos);
            finish();
        }
    }

希望你受到启发。


0

也许你会对RxPaparazzo感兴趣。这个库支持API 24(Android 7),并允许您从相机、图库、文件系统甚至远程图像(例如来自Google照片或Google Drive)中获取图像

使用方法如下:

RxPaparazzo.takeImage(activityOrFragment)
    .usingCamera()  // or .usingGallery()
    .subscribe(response -> {
        if (response.resultCode() != RESULT_OK) {
            response.targetUI().showUserCanceled();
            return;
        }

        response.targetUI().loadImage(response.data());
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接