268 votos

¿Cómo elegir una imagen de la Galería (tarjeta SD) para mi aplicación en Android?

Esta pregunta fue hecha originalmente para Android 1.6.

Estoy trabajando sobre las opciones de fotos en mi aplicación.

Tengo un botón y un ImageView en mi actividad. Cuando hago clic en el botón redirige a la galería y sería capaz de seleccionar una imagen. La imagen seleccionada aparecerá en mi ImageView.

¿Cómo hacerlo? ¿Alguna idea?

360voto

Steve Haley Puntos 26928

Las otras respuestas se explica cómo enviar el intento, pero no explican bien cómo manejar la respuesta. Aquí está el código de ejemplo sobre cómo hacerlo:

protected void onActivityResult(int requestCode, int resultCode, 
       Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch(requestCode) { 
    case REQ_CODE_PICK_IMAGE:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.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 filePath = cursor.getString(columnIndex);
            cursor.close();


            Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
        }
    }
}

Después de esto, tienes la imagen seleccionada se almacena en "yourSelectedImage" para hacer lo que quiera con el. Este código funciona mediante la obtención de la ubicación de la imagen en la ContentResolver de la base de datos, pero que por sí sola no es suficiente. Cada imagen tiene cerca de 18 columnas de información, que van desde su filepath 'fecha de la última modificación " a las coordenadas GPS de donde fue tomada la foto, a pesar de que muchos de los campos que no se utilizan realmente.

Para ahorrar tiempo, en realidad no necesita de los otros campos, el cursor de la búsqueda se realiza con un filtro. El filtro funciona especificando el nombre de la columna que desea, MediaStore.Images.Media.DATA, que es la ruta de acceso y, a continuación, dando string[] a la consulta de cursor. El cursor de la consulta devuelve la ruta de acceso, pero no sabe que la columna es hasta que usted utilice la columnIndex código. Que simplemente obtiene el número de la columna en función de su nombre, el mismo que se utiliza en el proceso de filtrado. Una vez que has conseguido que, por fin eres capaz de decodificar la imagen en un mapa de bits con la última línea de código que me dio.

282voto

siamii Puntos 5133
private static final int SELECT_PHOTO = 100;

Intención de inicio

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);    

Resultado de proceso

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch(requestCode) { 
    case SELECT_PHOTO:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            InputStream imageStream = getContentResolver().openInputStream(selectedImage);
            Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
        }
    }
}

Alternativamente, también puede reducir la resolución de su imagen para evitar errores de OutOfMemory.

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 140;

        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
               || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);

    }

84voto

Robby Pond Puntos 37875

Tienes que empezar la intención de galería para obtener un resultado.

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

Luego en onActivityForResult , llame a intent.getData() para obtener el Identificador Uri de la imagen. Entonces tienes que conseguir la imagen de la ContentProvider.

14voto

mbaird Puntos 31293

Haga lo siguiente para iniciar la galería y permiten al usuario elegir una imagen:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);

Luego en su onActivityResult() utilizar el URI de la imagen que se vuelve a fijar la imagen en su ImageView.

10voto

Sheetal More Puntos 102
public class EMView extends Activity {
ImageView img,img1;
int column_index;
  Intent intent=null;
// Declare our Views, so we can access them later
String logo,imagePath,Logo;
Cursor cursor;
//YOU CAN EDIT THIS TO WHATEVER YOU WANT
private static final int SELECT_PICTURE = 1;

 String selectedImagePath;
//ADDED
 String filemanagerstring;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    img= (ImageView)findViewById(R.id.gimg1);



    ((Button) findViewById(R.id.Button01))
    .setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

            // in onCreate or any event where your want the user to
            // select a file
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,
                    "Select Picture"), SELECT_PICTURE);


        }
    });
}

//UPDATED
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();

            //OI FILE Manager
            filemanagerstring = selectedImageUri.getPath();

            //MEDIA GALLERY
            selectedImagePath = getPath(selectedImageUri);


            img.setImageURI(selectedImageUri);

           imagePath.getBytes();
           TextView txt = (TextView)findViewById(R.id.title);
           txt.setText(imagePath.toString());


           Bitmap bm = BitmapFactory.decodeFile(imagePath);

          // img1.setImageBitmap(bm);



        }

    }

}

//UPDATED!
public String getPath(Uri uri) {
String[] projection = { MediaColumns.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
column_index = cursor
        .getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
 imagePath = cursor.getString(column_index);

return cursor.getString(column_index);
}

}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X