onActivityResult's intent.getPath() doesn't give me the correct filename
I am trying to fetch a file this way:
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);
}
Then in onActivityResult
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
According to many threads I'm supposed to fetch the file name from the intent with data.getData().getPath()
, the file name I'm expecting is my_file.pdf, but instead I'm getting this :
/document/acc=1;doc=28
So what to do? Thanks for your help.
I am trying to fetch a file
Not with that code. That code is asking the user to pick a piece of content. This may or may not be a file.
According to many threads I'm supposed to fetch the file name from the intent with data.getData().getPath()
That was never correct, though it tended to work on older versions of Android.
So what to do?
Well, that depends.
If you wish to only accept files, integrate a file chooser library instead of using (UPDATE 2019-04-06: since Android Q is banning most filesystem access, this solution is no longer practical)ACTION_GET_CONTENT
.
If you are willing to allow the user to pick a piece of content using ACTION_GET_CONTENT
, please understand that it does not have to be a file and it does not have to have something that resembles a filename. The closest that you will get:
If
getScheme()
of theUri
returnsfile
, your original algorithm will workIf
getScheme()
of theUri
returnscontent
, useDocumentFile.fromSingleUri()
to create aDocumentFile
, then callgetName()
on thatDocumentFile
— this should return a "display name" which should be recognizable to the user