es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ACTION_GET_CONTENT para obtener la imagen devuelve una URI nula.

Tengo una aplicación publicada que utiliza un intent ACTION_GET_CONTENT para permitir al usuario seleccionar una de sus imágenes. Aquí está el código que lanza el intent:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.putExtra(Intent.CATEGORY_OPENABLE, true);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_pic)), SELECT_IMAGE);

Y aquí está el onActivityResult:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode == RESULT_OK) {
        if (requestCode == SELECT_IMAGE) {
            if (data != null) {
                Uri uri = data.getData();
                ...
                }
            }
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}

El problema aquí es que, en algunos dispositivos, uri es nulo incluso si el usuario ha seleccionado una imagen. Principalmente en dispositivos Samsung y también en algunos teléfonos Motorola. También lo intenté con ACTION_PICK en lugar de ACTION_CONTENT, pero también sucedió en algunos otros dispositivos. Así que me gustaría saber si hay alguna manera de permitir al usuario seleccionar una imagen que sea universal.

Algunos teléfonos que sufren este problema son:
– Samsung galaxy A21S – Android 11 (SDK 30)
– Samsung galaxy A3 (2016) – Android 7.0 (SDK 24)
– Motorola moto e6 play – Android 9 (SDK 28)

Algunos de los usuarios de estos dispositivos afectados están notificando que esto ocurre solo a veces.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Tengo una aplicación publicada que usa la intención ACTION_GET_CONTENT para permitir al usuario seleccionar una de sus imágenes. Aquí está el código que lanza la intención: El problema aquí es que, en algunos dispositivos, uri es nulo aunque el usuario haya seleccionado una imagen. Principalmente en dispositivos Samsung y algunos teléfonos Motorola. También intenté con ACTION_PICK en lugar de ACTION_CONTENT, pero también ocurrió en algunos otros dispositivos. Entonces quisiera saber si hay alguna forma de permitir al usuario elegir una imagen que sea universal.

    El problema de uri siendo nulo aunque el usuario haya seleccionado una imagen mientras usa las intenciones ACTION_GET_CONTENT o ACTION_PICK es un problema conocido en algunos dispositivos Samsung y Motorola. Este problema ocurre solo algunas veces en dispositivos afectados, y no está relacionado con el código que has escrito.

    Para resolver este problema, puedes usar una biblioteca de terceros como TedPicker o EasyImage. Estas bibliotecas proporcionan una manera simple de obtener imágenes del dispositivo del usuario y funcionan bien en la mayoría de los dispositivos. Otra forma de resolver este problema es usar la API MediaStore para obtener las imágenes del usuario. Este enfoque requiere código adicional, pero asegura que tu aplicación funcione bien en todos los dispositivos.

    Aquí tienes un ejemplo de cómo usar la API MediaStore:

    // consulta a MediaStore para todas las imágenes
    String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
    String selection = null;
    String[] selectionArgs = null;
    String sortOrder = null;
    Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            sortOrder);
    if (cursor != null && cursor.moveToFirst()) {
        // iterar sobre todas las imágenes
        do {
            long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
            String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
            Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
            // hacer algo con la imagen
            ...
        } while (cursor.moveToNext());
        cursor.close();
    }
    

    Al usar la API MediaStore, puedes recuperar todas las imágenes del usuario sin depender de las intenciones ACTION_GET_CONTENT o ACTION_PICK. Este enfoque asegura que tu aplicación funcione bien en todos los dispositivos.

Comments are closed.