Java 从gallery android 5.1中选择图像

Java 从gallery android 5.1中选择图像,java,android,android-5.0-lollipop,Java,Android,Android 5.0 Lollipop,我使用的是从手机中拾取图像的标准方式。。除了安卓5.0及以上版本外,我的代码在所有安卓系统上都能正常工作 我做了一些调试,问题似乎如下: public String getPath (Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

我使用的是从手机中拾取图像的标准方式。。除了安卓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);
 }
我所做的prinln为ImagePath返回null。。这就是问题所在。。除了5.0+,它在任何其他android上都不会返回null。。我如何才能让它工作?

试试:

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

您应该使用
startActivityForResult
onActivityResult
。 诀窍:

然后:

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

希望你受到启发。

也许你会感兴趣。该库支持API 24(Android 7),允许您从相机、多媒体资料、文件系统甚至远程图像(例如,从Google Photos或Google Drive)拍摄图像

用法如下:

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

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

我也注意到了这一点。安卓5.0似乎打破了数据列。这将是一个很好的答案,这是一个真正的修复。。。。
RxPaparazzo.takeImage(activityOrFragment)
    .usingCamera()  // or .usingGallery()
    .subscribe(response -> {
        if (response.resultCode() != RESULT_OK) {
            response.targetUI().showUserCanceled();
            return;
        }

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