onActivityResult 的 intent.getPath() 没有给我正确的文件名

Rob*_*Rob 5 android file

我正在尝试以这种方式获取文件:

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);
    }
Run Code Online (Sandbox Code Playgroud)

然后在onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)

根据许多线程,我应该从意图中获取文件名 with data.getData().getPath(),我期望的文件名是my_file.pdf,但我得到的是:

/document/acc=1;doc=28

那么该怎么办?谢谢你的帮助。

Com*_*are 8

我正在尝试获取文件

不是用那个代码。该代码要求用户选择一段内容。这可能是也可能不是文件。

根据许多线程,我应该使用 data.getData().getPath() 从意图中获取文件名

这从来都不是正确的,尽管它往往适用于旧版本的 Android。

那么该怎么办?

嗯,这取决于。

如果您只想接受文件,请集成文件选择器库而不是使用ACTION_GET_CONTENT. 更新 2019-04-06:由于 Android Q 禁止大多数文件系统访问,此解决方案不再实用)

如果您愿意允许用户使用 选择一段内容ACTION_GET_CONTENT,请理解它不必是文件,也不必具有类似于文件名的内容。您将获得的最接近的:

  • 如果getScheme()在的Uri回报file,你原来的算法将工作

  • 如果getScheme()在的Uri回报content,使用DocumentFile.fromSingleUri()创建DocumentFile,然后调用getName()DocumentFile-这应该返回一个“显示名称”,这应该是识别用户