从图库android 5.1中选择图像

时间:2015-04-01 21:00:48

标签: java android android-5.0-lollipop

我正在使用标准的android pick images from gallery方式从手机中挑选图片。除了Android 5.0及更高版本之外,我的相同代码在所有Android上运行得非常好。

我做了一些调试,问题似乎如下:

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返回null fOR ImagePath ..这里的问题是..除了5.0+之外,它不会在任何其他android上返回null ..我怎么能让它工作?

3 个答案:

答案 0 :(得分:0)

尝试:

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

答案 1 :(得分:0)

您应该使用startActivityForResultonActivityResult。 招数:

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

希望你受到启发。

答案 2 :(得分:0)

也许你可能对RxPaparazzo感兴趣。此库支持API 24(Android 7),允许您从相机,图库,文件系统甚至远程图像(例如,从Google照片或Google云端硬盘)获取图像

用法是这样的:

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

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