android elige imágenes de la galería

11 minutos de lectura

android elige imagenes de la galeria
buda gavril

Quiero crear un selector de imágenes de la galería. yo uso codigo

 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 ya se muestran archivos de video. ¿Hay alguna forma de filtrar los archivos que se muestran para que no se muestren archivos de video en esta actividad?

  • Este artículo describe muy bien cómo elegir imágenes de la galería: androidbitmaps.blogspot.com/2015/04/…

    –Andy Res

    17 de abril de 2015 a las 5:13

  • Hay una pregunta similar como tú. stackoverflow.com/a/31382240/1835650

    – Rastreador de camisetas

    13 de julio de 2015 a las 11:39

android elige imagenes de la galeria
JMRboosties

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 olvides también crear la constante. PICK_IMAGEpara que puedas reconocer cuando el usuario regresa de la galería de imágenes 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 llamo a la galería de imágenes. Ponlo y mira si te funciona.

EDITAR:

Esto abre la aplicación Documentos. Para permitir que el usuario también use cualquier aplicación de galería que pueda haber instalado:

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

  • Obtengo 2 opciones en este “Sistema Android”, “Documentos”. Si selecciono Sistema Android, me presenta Galería y Fotos. ¿Cómo me deshago de esta lista de opciones intermedias?

    – Udayaditya Barua

    11 de diciembre de 2015 a las 7:54


  • @Uday es simplemente porque no ha establecido el valor predeterminado. Solo déjalo 🙂

    – Tristán Wiley

    08/01/2016 a las 22:31

  • ¿A qué se debe configurar la constante PICK_IMAGE? Dice “No se puede resolver el símbolo “PICK_IMAGE”

    – Miguel

    20 de agosto de 2016 a las 18:15

  • @Michael el PICK_IMAGE constante tiene cualquier interno estático valor determinado por usted en esta misma clase, esto se usa más en el @Override función onActivityResult(int requestCode, resultCode, Intent data)donde se recomienda que utilice esta constante para comprobar la requestCode parámetro antes de hacer cualquier acción 🙂

    – Gabcvit

    14/09/2017 a las 14:06


  • Puede recuperar el mapa de bits del método onActivityResult(…) con el siguiente código (suponiendo RESULT_OK): Bitmap bitmap = data.getExtras().getParcelable(“data”);

    – Shn_Android_Dev

    1 de marzo de 2018 a las 21:58


android elige imagenes de la galeria
Benjamín

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

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

Puede seguir el código a continuación o mirar mi esencia actualizada.

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

  • if(resultCode == Activity.RESULT_OK) {...} se puede utilizar para detectar el éxito/cancelar

    – Thamme Gowda

    4 de febrero de 2014 a las 13:57

  • ¿Cómo puedes obtener el camino?

    usuario3402040

    9 oct 2015 a las 10:27

  • @delive, creo que podrías intentarlo new File(data.getData()).getAbsolutePath() Solo una suposición, no lo he probado.

    – Alguien en alguna parte

    17 dic 2015 a las 15:14

  • Advertencia de excepción FileNotFound de Android Studio en fragmento en getActivity().getContentResolver().openInputStream(data.getData());.

    – Iqbal

    27 de enero de 2016 a las 11:02


  • Esto funciona en ciertos dispositivos en los que no se devuelve la ruta del archivo. Sin embargo, no veo forma de determinar, una vez que tengo InputStream, cómo averiguar la orientación de la imagen.

    –Casey Perkins

    9 de febrero de 2017 a las 19:08

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


}

  • Muchas gracias. Esta respuesta me ayudó a subir la imagen más tarde.

    – Rosário Pereira Fernandes

    21 de agosto de 2017 a las 1:25

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

    – Matías

    26 de noviembre de 2017 a las 9:21

  • Sé que es una pregunta nueva pero, ¿por qué hicimos todo esto para obtener la ruta de la imagen? ¿Qué devuelve data.getData entonces?

    – moumen Shobakey

    5 de febrero de 2020 a las 9:12

  • cual es el valor de path? en File file = new File(path);

    – Ravi Vania

    3 de marzo de 2020 a las 10:05


Puede usar este método para elegir una imagen de la galería. Solo se mostrarán 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 anula 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");
            }
        }
    }

1646746993 875 android elige imagenes de la galeria
Linh

Aquí hay un ejemplo completo para solicitar permiso (si es necesario), elegir una imagen de la galería y luego convertir la imagen a bitmap o file

AndroidManifesh.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Actividad

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

Manifestación
https://github.com/PhanVanLinh/AndroidPickImage

  • Esto es nada menos que una biblioteca, especialmente con esa función de relación de aspecto y recorte. Nunca supe que existiera tal cosa. Muchas gracias señor.

    – Lalit Fauzdar

    9 de mayo de 2020 a las 14:43


  • Aquí atrás, no es tan bueno como esperaba viendo las primeras impresiones. No selecciona la imagen cuando se edita con Snapseed, no se bloquea pero no hay imagen, la aplicación de galería predeterminada de Huawei no hace nada cuando hago clic en siguiente después de editar, no edita la imagen cuando se selecciona de Google Photos, tráigala de vuelta sin ella directamente. Funciona bien solo si elijo la galería predeterminada de huawei y google photos para editarla.

    – Lalit Fauzdar

    9 de mayo de 2020 a las 16:14

  • Gracias. Muy buena respuesta y funciona muy bien a la primera.

    – sagar.android

    25 de mayo de 2021 a las 13:05

1646746993 7 android elige imagenes de la galeria
abolfazl bazghandi

Tengo el mismo problema. Uso estos códigos.

addIntent

 Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Tack Image"), PICK_PHOTO);

agregar onActivityResult

 @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO && resultCode == Activity.RESULT_OK) {
      if (data == null) {
      //error
        return;
      }
      try {
        Uri uri = data.getData();
        File file = FileUtil.from(currentActivity, uri);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

clase FileUtil

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {
  private static final int EOF = -1;
  private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

  private FileUtil() {

  }

  public static File from(Context context, Uri uri) throws IOException {
    InputStream inputStream = context.getContentResolver().openInputStream(uri);
    String fileName = getFileName(context, uri);
    String[] splitName = splitFileName(fileName);
    File tempFile = File.createTempFile(splitName[0], splitName[1]);
    tempFile = rename(tempFile, fileName);
    tempFile.deleteOnExit();
    FileOutputStream out = null;
    try {
      out = new FileOutputStream(tempFile);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    if (inputStream != null) {
      copy(inputStream, out);
      inputStream.close();
    }

    if (out != null) {
      out.close();
    }
    return tempFile;
  }

  private static String[] splitFileName(String fileName) {
    String name = fileName;
    String extension = "";
    int i = fileName.lastIndexOf(".");
    if (i != -1) {
      name = fileName.substring(0, i);
      extension = fileName.substring(i);
    }

    return new String[]{name, extension};
  }

  private static String getFileName(Context context, Uri uri) {
    String result = null;
    if (uri.getScheme().equals("content")) {
      Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
      try {
        if (cursor != null && cursor.moveToFirst()) {
          result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
        }
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        if (cursor != null) {
          cursor.close();
        }
      }
    }
    if (result == null) {
      result = uri.getPath();
      int cut = result.lastIndexOf(File.separator);
      if (cut != -1) {
        result = result.substring(cut + 1);
      }
    }
    return result;
  }

  private static File rename(File file, String newName) {
    File newFile = new File(file.getParent(), newName);
    if (!newFile.equals(file)) {
      if (newFile.exists() && newFile.delete()) {
        Log.d("FileUtil", "Delete old " + newName + " file");
      }
      if (file.renameTo(newFile)) {
        Log.d("FileUtil", "Rename file to " + newName);
      }
    }
    return newFile;
  }

  private static long copy(InputStream input, OutputStream output) throws IOException {
    long count = 0;
    int n;
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    while (EOF != (n = input.read(buffer))) {
      output.write(buffer, 0, n);
      count += n;
    }
    return count;
  }
}

y debes agregar rutas_proveedor.xml a la carpeta xml como imagen
ingrese la descripción de la imagen aquí

rutas_proveedor.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

y finalmente agregar a continuación en AndroidManifest.xml

<application
...>

...
      <provider
          android:name="androidx.core.content.FileProvider"
          android:authorities="${applicationId}.provider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
        </provider>
...
</application>

espero haber ayudado

  • Esto es nada menos que una biblioteca, especialmente con esa función de relación de aspecto y recorte. Nunca supe que existiera tal cosa. Muchas gracias señor.

    – Lalit Fauzdar

    9 de mayo de 2020 a las 14:43


  • Aquí atrás, no es tan bueno como esperaba viendo las primeras impresiones. No selecciona la imagen cuando se edita con Snapseed, no se bloquea pero no hay imagen, la aplicación de galería predeterminada de Huawei no hace nada cuando hago clic en siguiente después de editar, no edita la imagen cuando se selecciona de Google Photos, tráigala de vuelta sin ella directamente. Funciona bien solo si elijo la galería predeterminada de huawei y google photos para editarla.

    – Lalit Fauzdar

    9 de mayo de 2020 a las 16:14

  • Gracias. Muy buena respuesta y funciona muy bien a la primera.

    – sagar.android

    25 de mayo de 2021 a las 13:05

1646746995 457 android elige imagenes de la galeria
francolot

Solución Kotlin 2021 con nueva versión de Fragment:

dependencies {
  implementation "androidx.fragment:fragment:1.3.3"
}
class YourFragment : Fragment() {

    private val fileChooserContract = registerForActivityResult(ActivityResultContracts.GetContent()) { imageUri ->
        if (imageUri != null) {
            // imageUri now contains URI to selected image
        }
    }

    // ...

    fun openFileChooser() {
        fileChooserContract.launch("image/*")
    }
}

  • ¿Cómo configurar el título del selector?

    – Serguéi Stasishin

    13 de julio de 2021 a las 9:04

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad