2015-04-01 91 views
3

我使用的标准android pick images from gallery从手机中挑选图像的方式..我的同样的代码在除android 5.0及以上的所有android上完全正常工作。从图库中挑选图像android 5.1

我做了一些调试和问题似乎是以下:

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

我没有返回null ImagePath的..这是哪里的问题。它没有任何其他Android返回空开。prinln从5.0+ ..我如何得到这个工作?

+0

我也注意到了这一点。看来Android 5.0打破了数据列。这将是一个很好的答案,这是一个真正的解决方案.... – James 2015-04-28 11:16:16

回答

0

尝试:

String imagePath = cursor.getString(cursor.getColumnIndex(projection[0])); 
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(); 
     } 
    } 

希望你启发。

0

也许你可能会对RxPaparazzo感兴趣。该库支持API 24(安卓7),并允许您从相机,画廊,文件系统,甚至远程图像(例如,从谷歌的照片或谷歌驱动器)拍摄图像

用法是这样的:

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

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