intent.getPath() de onActivityResult no me da el nombre de archivo correcto
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.
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 ( 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)ACTION_GET_CONTENT
.
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 lasUri
devolucionesfile
, 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 usuarioUri
.content
DocumentFile.fromSingleUri()
DocumentFile
getName()
DocumentFile