从 onActivityResult Intent 获取一个或多个文件及其文件名?

Getting one or more files from onActivityResult Intent, and their filenames?

我使用此代码允许用户从他们的存储中select 多个 .csv 文件:

    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("text/comma-separated-values");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    startActivityForResult(Intent.createChooser(intent, "Get CSV Files"), REQUEST_IMPORT_CSV);

选择文件后,它会转到 onActivityResult(),到目前为止我已经完成了:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQUEST_IMPORT_CSV:
            if (data != null) {
                ClipData clipData = data.getClipData();
                ArrayList<Uri> csvUris = new ArrayList<>();
                if (clipData != null) {
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        clipData.getItemAt(i).getText()
                        csvUris.add(clipData.getItemAt(i).getUri());
                    }
                }
                else {
                    csvUris.add(data.getData());
                }

            }
            break;
    }
}
  1. 这是从结果中获取所有相关 Uris 的正确方法吗?如果用户选择了一个文件,我从 data.getData() 获取了 Uri,如果用户选择了多个文件,那么它会直接转到这个 clipData() 东西。

  2. 假设(1)是正确的,如何获取用户选择的相应文件的文件名?例如 "chosen_file.csv" (我不是要路径)。

Is this the right way to get all the relevant Uris from the result?

据我所知,是的。至少,它对我有用。

how do I get the filenames of the corresponding files that the user chose?

严格来说,你没有。没有要求 Uri 指向文件,正如此网页的 URL 必须指向文件一样。

可以 做的是将 Uri 包装在 DocumentFilevia fromSingleUri() 中。然后,在 DocumentFile 上调用 getName() 以获得内容的 "display name"。根据用户从何处获取内容,此 可能 是一个类似文件名的值。它应该是用户可识别的东西。但是,不要假设它是文件名,因为它可能是其他名称。