Android – Image Picker, неправильное изображение

Я начинаю запрос на выбор изображения:

Intent intent = new Intent(); intent.setType( "image/*" ); intent.setAction( Intent.ACTION_GET_CONTENT ); startActivityForResult( Intent.createChooser( intent, "Choose"), PHOTO_GALLERY ); 

И получение данных обратно в onActivityResult :

 if( resultCode == Activity.RESULT_OK && requestCode == PHOTO_GALLERY ) { U.log( data.getData() ); Bitmap bm = ... // built from the getData() Uri this.postImagePreview.setImageBitmap( bm ); } 

Когда я запускаю Intent, я вижу несколько папок, таких как sdcard , Drop Box , MyCameraApp и т. Д.

Если я выбрал изображение с sdcard , когда sdcard предварительный просмотр, это совершенно неправильное изображение. Другие папки, похоже, не дают мне эту проблему.

Кто-нибудь знает, почему это позволило мне выбрать один образ, а затем дать мне Ури для другого?

РЕДАКТИРОВАТЬ: Ниже приведены некоторые зарегистрированные данные getData() :

Хорошо:

content://com.google.android.gallery3d.provider/picasa/item/5668377679792530210

Плохо:

content://media/external/images/media/28

EDIT: у меня все еще возникают проблемы при выборе из папки sdcard в галерее.

Вот немного больше расширения того, что я делаю в onActivityResult:

 // cursor Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = mContext.getContentResolver().query( selectedImage, filePathColumn, null, null, null ); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex( filePathColumn[0] ); String filePath = cursor.getString( columnIndex ); cursor.close(); // Cursor: /mnt/sdcard/Pic.jpg : /mnt/sdcard/Pic.jpg U.log( "Cursor: " + filePath + " : " + Uri.parse( filePath ) ); // "regular" // Regular: content://media/external/images/media/28 : content://media/external/images/media/28 U.log( "Regular: " + data.getDataString() + " : " + Uri.parse( data.getDataString() ) ); // Regular 2: content://media/external/images/media/28 : content://media/external/images/media/28 U.log( "Regular 2: " + data.getData() + " : " + data.getData() ); mPostImagePreview.setImageBitmap( BitmapFactory.decodeFile( filePath ) ); mPostImagePreview.setVisibility( View.VISIBLE ); 

Они по-прежнему устанавливают неправильный образ. Если я войду в Галерею, долгое нажатие на изображение и просмотр его деталей, я получаю:

 TItle: Pic Time: May 2, 2012 Width: 720 Height: 1280 Orientation: 0 File size: 757KB Maker: Abso Camera Model: Inspire 4G Path: /mnt/sdcard/Pic.jpg 

Итак, Галерея говорит мне, что путь такой же, как и действие выбора, и Галерея правильно его отображает. Так почему же это не рендеринг, если я установил его из onActivityResult?

Кроме того, это код, который я использую для запуска Intent сейчас:

 private void selectPhoto() { Intent intent = new Intent( Intent.ACTION_GET_CONTENT ); intent.setType( "image/*" ); ( ( Activity )mContext ).startActivityForResult( Intent.createChooser( intent, "Select Picture" ), PHOTO_GALLERY ); } 

Solutions Collecting From Web of "Android – Image Picker, неправильное изображение"

Иногда миниатюры в приложении галереи могут устаревать и показывать эскизы для другого изображения. Это может произойти, когда идентификаторы изображений повторно используются, например, когда изображение удаляется, а новый добавляется с использованием того же идентификатора.

Управление приложениями> Галерея> Очистить данные можно исправить эту проблему.

Это код для открытия галереи. Однако это то же самое, что вы сделали. Также см. Код onActivityResult который я использовал для извлечения выбранного изображения.

 Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PHOTO_GALLERY); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PHOTO_GALLERY: if (resultCode == RESULT_OK) { Uri selectedImageUri = Uri.parse(data.getDataString()); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap( getApplicationContext().getContentResolver(), selectedImageUri); this.postImagePreview.setImageBitmap( bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } } } 

private static int RESULT_LOAD_IMAGE = 1;

 Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); 

Результат OnActivity

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); ImageView imageView = (ImageView) findViewById(R.id.imgView); imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); } } 

Попробуй это

  //Put this code on some event Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE); // When above event fire then its comes to this @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode==RESULT_OK && requestCode==1){ Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); filePath = cursor.getString(columnIndex); cursor.close(); // Use it as per recruitment actualBitmap =BitmapFactory.decodeFile(filePath); } } 

Попробуй это,

 public class SelectPhotoActivity extends Activity { private static final int SELECT_PICTURE = 1; private String selectedImagePath=""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(intent, SELECT_PICTURE); } public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); selectedImagePath = getPath(selectedImageUri); // here you can set the image } } } }