2012-04-23 9 views
14

estoy empezando una solicitud de selección de imagen:Android - del selector de imágenes, Imagen incorrecto

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

Y conseguir los datos de nuevo en onActivityResult:

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

Cuando inicio la intención, me vea algunas carpetas, como sdcard, Drop Box, MyCameraApp, y así sucesivamente.

Si selecciono una imagen de sdcard, cuando cargo la vista previa, es una imagen completamente incorrecta. Las otras carpetas no parecen darme este problema.

¿Alguien sabe por qué me deja elegir una imagen, y luego darme el Uri por otra?

EDIT: Éstos son algunos exampled conectado getData() s:

Buenas:

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

malo:

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

EDIT: Estoy ITS Tendremos problemas al elegir desde la carpeta sdcard de la galería.

Aquí es un poco más la expansión de lo que estoy haciendo en 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); 

Todavía establecer la imagen equivocada. Si entro en la Galería, pulse durante mucho tiempo la imagen y ver sus detalles me sale:

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 

Así, la galería me está diciendo que el camino es la misma que la accion de captura, y la galería está prestando correctamente . Entonces, ¿por qué no está procesando si lo configuro desde onActivityResult?

Además, este es el código que estoy usando para disparar el Intento ahora:

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

¿Este comportamiento es aleatorio? Quiero decir, ¿hay algún patrón que veas cuando repites la selección de imágenes ...? – Ronnie

+2

tal vez las miniaturas en la galería son incorrectas. esto puede suceder si, por ejemplo, las imágenes se eliminan porque Android vuelve a utilizar los identificadores de imagen. – uwe

+0

@ userSeven7s: Siempre cuando selecciono de la carpeta sdcard de la aplicación Galería. – Josh

Respuesta

4

A veces las miniaturas en la aplicación de la galería pueden estar desactualizadas y mostrar miniaturas para una imagen diferente. Esto puede suceder cuando los identificadores de imagen se reutilizan, por ejemplo, cuando una imagen se borra y se agrega una nueva con el mismo ID.

Administrar aplicaciones> Galería> Borrar datos puede solucionar este problema a continuación.

+0

¡Gracias de nuevo! Lamentablemente, parece que el sistema asignó automáticamente la recompensa cuando el tiempo se agotó el otro día, pero he marcado la tuya como la respuesta correcta :) – Josh

5

Este es el código para abrir la galería. Sin embargo, esto es lo mismo que has hecho. También vea el código onActivityResult que utilicé para recuperar la imagen seleccionada.

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; 
     } 
    } 
} 
+0

Ver mi edición, esto todavía no está funcionando. – Josh

3

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 Resultado

@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)); 
      } 
     } 
+0

Aparte de la intención ligeramente diferente, eso es literalmente exactamente lo que tengo ahora, como se señaló en mi edición anterior de la publicación. Intenté tu intento de disparar, y todavía produce el mismo resultado. – Josh

+0

+1 para su respuesta bummbat – dhams

3

prueba este

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

       } 
    } 
0

probar esto,

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

} 
Cuestiones relacionadas