2011-03-15 21 views
125

Quiero crear un selector de imágenes de la galería. Uso el códigoandroid recoger imágenes de la galería

intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(intent, TFRequestCodes.GALLERY); 

Mi problema es que en esta actividad y archivos de video se muestran. ¿Hay alguna forma de filtrar los archivos mostrados para que no se muestren archivos de video en esta actividad?

+3

En este artículo se describe muy bien cómo elegir imágenes de la galería: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android- part-iii-pick.html –

+0

Hay una pregunta similar a la tuya. http://stackoverflow.com/a/31382240/1835650 – TeeTracker

Respuesta

231

Absolutamente. Prueba esto:

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 

No se olvide también para crear la constante PICK_IMAGE, por lo que puede reconocer cuando el usuario regresa de la galería de imágenes de la actividad:

public static final int PICK_IMAGE = 1; 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == PICK_IMAGE) { 
     //TODO: action 
    } 
} 

Así es como me llamo galería de imágenes. Póngalo y vea si funciona para usted.

EDIT:

Esto nos lleva a la aplicación Documentos. Para permitir al usuario utilizar también cualquier galería de aplicaciones que podrían haber instalados:

Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    getIntent.setType("image/*"); 

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    pickIntent.setType("image/*"); 

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image"); 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent}); 

    startActivityForResult(chooserIntent, PICK_IMAGE); 
+3

Tengo 2 opciones en este "Sistema Android", "Documentos". Si selecciono Android System, entonces me aparece Gallery and Photos. ¿Cómo me deshago de esta lista de opciones intermedias? – Uday

+3

@Uday es simplemente porque no ha configurado el valor predeterminado.Déjalo :) –

+12

¿En qué se debe configurar la constante PICK_IMAGE? Dice "No se puede resolver el símbolo" PICK_IMAGE " – Michael

157

A veces, no se puede obtener un archivo de la imagen que desea. Es porque el elegido proviene de Google+, Drive, Dropbox o cualquier otro proveedor.

La mejor solución es pedirle al sistema que elija un contenido a través del Intent.ACTION_GET_CONTENT y obtenga el resultado con un proveedor de contenido.

Puede seguir el código de abajo o mirar mi updated gist.

public void pickImage() { 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) { 
     if (data == null) { 
      //Display an error 
      return; 
     } 
     InputStream inputStream = context.getContentResolver().openInputStream(data.getData()); 
     //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap... 
    } 
} 
+11

'if (resultCode == Activity.RESULT_OK) {...}' puede ser usado para detectar el éxito/cancelar –

+0

¿Cómo se puede obtener la ruta? – delive

+0

@delive, creo que se puede probar 'new File (data.getData()). getAbsolutePath()' Solo una conjetura, no lo he intentado –

1

Si solo está buscando imágenes y selección múltiple.

Look @ una vez https://stackoverflow.com/a/15029515/1136023

Es útil para future.i personalmente siento muy bien mediante el uso de MultipleImagePick.

+0

¿cuál es la forma más rápida de utilizar MultipleImagePick como biblioteca? Viene como un proyecto/aplicación independiente. – ticofab

18
public void FromCamera() { 

    Log.i("camera", "startCameraActivity()"); 
    File file = new File(path); 
    Uri outputFileUri = Uri.fromFile(file); 
    Intent intent = new Intent(
      android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    startActivityForResult(intent, 1); 

} 

public void FromCard() { 
    Intent i = new Intent(Intent.ACTION_PICK, 
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(i, 2); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == 2 && 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(); 

     bitmap = BitmapFactory.decodeFile(picturePath); 
     image.setImageBitmap(bitmap); 

     if (bitmap != null) { 
      ImageView rotate = (ImageView) findViewById(R.id.rotate); 

     } 

    } else { 

     Log.i("SonaSys", "resultCode: " + resultCode); 
     switch (resultCode) { 
     case 0: 
      Log.i("SonaSys", "User cancelled"); 
      break; 
     case -1: 
      onPhotoTaken(); 
      break; 

     } 

    } 

} 

protected void onPhotoTaken() { 
    // Log message 
    Log.i("SonaSys", "onPhotoTaken"); 
    taken = true; 
    imgCapFlag = true; 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 4; 
    bitmap = BitmapFactory.decodeFile(path, options); 
    image.setImageBitmap(bitmap); 


} 
+0

Gracias pero la dosis id no funciona en api 25?! –

+0

Muchas gracias. Esta respuesta me ayudó a cargar la imagen más tarde en –

+0

Supongo que te refieres al caso 1: en lugar del caso -1: en el interruptor en OnActivityResult. – Mathias

-5

U puede hacerlo más fácil que esto respuestas:

Uri Selected_Image_Uri = data.getData(); 
ImageView imageView = (ImageView) findViewById(R.id.loadedimg); 
imageView.setImageURI(Selected_Image_Uri); 
+0

lo hago, y funcionó. si necesita usar para archivar, por ejemplo, para enviar al servidor, tiene que usar otras formas, pero solo para cargar una imagen en la vista de imagen, puede hacer esta fácil solución. –

+4

¡Bienvenido a SO! En lugar de comentar tu propia publicación, también puedes editar tu publicación. Si se supone que tu comentario explica la respuesta, ¿por qué no lo pones en la respuesta misma? Personalmente, no veo cómo su respuesta (tardía) a esta pregunta anterior está relacionada con la pregunta. ¿Puedo sugerir que me concentre en responder las preguntas primero, que aún no tienen una respuesta aceptada? – cfi

+0

no puedo encontrar las preguntas de Android. ¿Cómo puedo ver solo las preguntas de Android? –

10

Puede utilizar este método para recoger la imagen de la galería. Solo se mostrarán las imágenes.

public void pickImage() { 
    Intent intent = new Intent(Intent.ACTION_PICK, 
      MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
    intent.setType("image/*"); 
    intent.putExtra("crop", "true"); 
    intent.putExtra("scale", true); 
    intent.putExtra("outputX", 256); 
    intent.putExtra("outputY", 256); 
    intent.putExtra("aspectX", 1); 
    intent.putExtra("aspectY", 1); 
    intent.putExtra("return-data", true); 
    startActivityForResult(intent, 1); 
} 

y anular onActivityResult como

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != RESULT_OK) { 
      return; 
     } 
     if (requestCode == 1) { 
      final Bundle extras = data.getExtras(); 
      if (extras != null) { 
       //Get image 
       Bitmap newProfilePic = extras.getParcelable("data"); 
      } 
     } 
    } 
+1

@Abhishek ... ¿dónde encontró el lista de extras permitidos para la intención de ACTION_PICK? ¡Gracias! –

+0

intenté muchos métodos, pero su asombroso pulgar funciona bien – Adiii

+1

No olvide agregar permisos de tiempo de ejecución para READ_EXTERNAL_STORAGE y WRITE_EXTERNAL_STORAGE para el nivel 23 de api o superior. De lo contrario, no obtendrás un mapa de bits de la galería como no nulo. Ver https://stackoverflow.com/a/35285667/3341089 – oguzhan

Cuestiones relacionadas