Android – 获取从文件资源管理器中选择的.txt文件的真实路径

我正在开发一个应用程序,我希望能够在.txt文件中导出和导入应用程序中的一些数据。 该应用程序的最低API为21。

导出部分运行良好,但我在导入部分遇到问题。

我打开文件浏览器:

butImportPatient.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_OPEN_DOCUMENT); intent.setType("*/*"); startActivityForResult(intent, IMPORTPATIENT_ACTIVITY_REQUEST_CODE); } }); 

这看起来很有效。

但我的onActivityResult不起作用,我没有找到如何从Uri获取文件。

现在,这是我的代码:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == IMPORTPATIENT_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { File file = new File(data.getData().getPath()) ; String path = file.getAbsolutePath() ; StringBuilder text = new StringBuilder(); try { BufferedReader br = new BufferedReader(new FileReader(path)); String line; while ((line = br.readLine()) != null) { text.append(line); text.append("\n"); } br.close(); } catch (IOException e) { e.printStackTrace(); } AlertDialog.Builder builder = new AlertDialog.Builder(this) ; builder.setMessage(path) .show() ; } } 

这是我在这里看到的多个post的混合,但似乎都没有。

我得到这条道路:

 /document/home:List.txt 

它会创建FileNotFoundException。 如何获得文件的真实路径?

我没有找到如何从Uri获取文件。

没有档案。 ACTION_OPEN_DOCUMENTACTION_GET_CONTENT不会打开文件。 他们打开一份文件。 该文档可能是一个文件。 它可能不会。 那个Uri可能会指出:

  • 外部存储上的本地文件
  • 另一个应用程序的内部存储上的本地文件
  • 可移动存储上的本地文件
  • 加密的本地文件,需要动态解密
  • 数据库中BLOB列中保存的字节流
  • 需要先由其他应用下载的内容
  • …等等

如何获得文件的真实路径?

你没有。

如果您只想接受文件,请集成文件选择器库,而不是使用ACTION_OPEN_DOCUMENTACTION_GET_CONTENT

如果你使用ACTION_GET_CONTENT ,并且你得到的Uri的方案是file ,那么getPath()将是一个文件系统路径。

否则,您需要了解您不知道文档的来源 ,并且不再考虑“文件的真实路径”。 使用ContentResolveropenInputStream() ,或DocumentFile.fromSingleUri()或类似技术来使用Uri