onActivityResult’s intent.getPath() no me da el nombre de archivo correcto

3 minutos de lectura

Estoy tratando de buscar un archivo de esta manera:

final Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
    String[] mimetypes = {"application/pdf"};
    chooseFileIntent.setType("*/*");
    chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
    if (chooseFileIntent.resolveActivity(activity
                        .getApplicationContext().getPackageManager()) != null) {
        chooseFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
        activity.startActivityForResult(chooseFileIntent, Uploader.PDF);
    }

luego en onActivityResult :

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

De acuerdo con muchos hilos, se supone que debo obtener el nombre del archivo de la intención con data.getData().getPath()el nombre del archivo que espero es mi_archivo.pdfpero en cambio estoy recibiendo esto:

/documento/acc=1;doc=28

¿Entonces lo que hay que hacer? Gracias por tu ayuda.

avatar de usuario
CommonsWare

Estoy tratando de buscar un archivo

No con ese código. Ese código le pide al usuario que elija una parte del contenido. Esto puede o no ser un archivo.

De acuerdo con muchos hilos, se supone que debo obtener el nombre del archivo de la intención con data.getData().getPath()

Eso nunca fue correcto, aunque tendía a funcionar en versiones anteriores de Android.

¿Entonces lo que hay que hacer?

Bueno eso depende.

Si solo desea aceptar archivos, integre una biblioteca selectora de archivos En lugar de usar ACTION_GET_CONTENT. (ACTUALIZACIÓN 2019-04-06: dado que Android Q está prohibiendo el acceso a la mayoría de los sistemas de archivos, esta solución ya no es práctica)

Si está dispuesto a permitir que el usuario elija una parte del contenido usando ACTION_GET_CONTENT, comprenda que no tiene que ser un archivo y no tiene que tener algo que se asemeje a un nombre de archivo. Lo más cercano que obtendrá:

  • Si getScheme() de El Uri devoluciones filesu algoritmo original funcionará

  • Si getScheme() de El Uri devoluciones contentutilizar DocumentFile.fromSingleUri() para crear un DocumentFileluego llame getName() en ese DocumentFile — esto debería devolver un “nombre para mostrar” que debería ser reconocible para el usuario

  • ¡Respuesta realmente genial y completa! Muchas gracias, DocumentFile.fromSingleUri() Hizo el truco 🙂

    – robo

    29 de enero de 2018 a las 22:12

  • @CommonsWare, ¿Cómo obtener la ruta del archivo usando DocumentFile?

    – Amila Iddamalgoda

    7 oct 2018 a las 12:37

  • @Amila No lo haces. abres un InputStream sobre el contenido identificado por el Uri en el DocumentFiley consumes el contenido de esa manera.

    – CommonsWare

    7 oct 2018 a las 12:47


  • ¡Puede que no funcione siempre! consulte mi solución: stackoverflow.com/a/59104787/3141844

    – Cris

    29 de noviembre de 2019 a las 12:28

Para obtener el nombre real y evitar obtener un nombre que parezca “imagen: 4431” o incluso solo un número, puede escribir el código recomendado por CommonsWare.

El siguiente es un ejemplo de un código que selecciona un solo archivo pdf, imprime su nombre y ruta al registro y luego envía el archivo por correo electrónico usando su uri.

private static final int FILEPICKER_RESULT_CODE = 1;
private static final int SEND_EMAIL_RESULT_CODE = 2;
private Uri fileUri;

private void chooseFile() {
    Intent fileChooser = new Intent(Intent.ACTION_GET_CONTENT);
    fileChooser.setType("application/pdf");
    startActivityForResult(Intent.createChooser(fileChooser, "Choose one pdf file"), FILEPICKER_RESULT_CODE);
}

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

    if (requestCode == FILEPICKER_RESULT_CODE) {
        if (resultCode == RESULT_OK) {
            fileUri = data != null ? data.getData() : null;
            if (fileUri != null) {
                DocumentFile d = DocumentFile.fromSingleUri(this, fileUri);
                if (d != null) {
                    Log.d("TAG", "file name: " + d.getName());
                    Log.d("TAG", "file path: " + d.getUri().getPath());
                    sendEmail(fileUri);
                }
            }
        }
    }
}

private void sendEmail(Uri path) {
    String email = "example@gmail.com";
    Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    intent.setType("application/octet-stream");
    intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "PDF file");
    String[] to = { email };
    intent.putExtra(Intent.EXTRA_EMAIL, to);
    intent.putExtra(Intent.EXTRA_TEXT, "This is the pdf file...");
    intent.putExtra(Intent.EXTRA_STREAM, path);
    startActivityForResult(Intent.createChooser(intent, "Send mail..."), SEND_EMAIL_RESULT_CODE);
}

Espero eso ayude.

¿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