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

Resuelto Rob asked hace 54 años • 2 respuestas

Estoy intentando recuperar 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);
}

Según muchos hilos, se supone que debo obtener el nombre del archivo de la intención data.getData().getPath(), el nombre del archivo que espero es my_file.pdf , pero en lugar de eso obtengo esto:

/document/acc=1;doc=28

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

Rob avatar Jan 01 '70 08:01 Rob
Aceptado

Estoy intentando recuperar un archivo

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

Según 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 desea aceptar solo archivos, integre una biblioteca de selección de archivos en lugar de usar ACTION_GET_CONTENT. ( ACTUALIZACIÓN 2019-04-06 : dado que Android Q prohíbe la mayoría del acceso a 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 parezca a un nombre de archivo. Lo más cerca que estarás:

  • Si getScheme()de las Uridevoluciones file, su algoritmo original funcionará

  • Si getScheme()devuelve , utilícelo para crear un , luego invoquelo ; esto debería devolver un "nombre para mostrar" que debería ser reconocible para el usuario Uri.contentDocumentFile.fromSingleUri()DocumentFilegetName()DocumentFile

CommonsWare avatar Jan 29 '2018 22:01 CommonsWare