Java Android-获取从文件浏览器中选择的.txt文件的实际路径

Java Android-获取从文件浏览器中选择的.txt文件的实际路径,java,android,file,android-activity,path,Java,Android,File,Android Activity,Path,我正在开发一个应用程序,我希望能够通过.txt文件从该应用程序导出和导入一些数据。 该应用程序的最低API为21 出口部分工作正常,但进口部分有问题 我打开文件资源管理器: butImportPatient.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent();

我正在开发一个应用程序,我希望能够通过.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() ;

        }
 }
这是我在这里看到的多个帖子的混合,但似乎都不起作用

我得到这条路:

/document/home:List.txt
它创建FileNotFoundException。如何获取文件的真实路径

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

没有文件<代码>操作\打开文档和
操作\获取内容
不打开文件。他们打开一份文件。该文档可能是一个文件。可能不会。
Uri
可能指向:

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

你没有

如果您只希望接受文件,请集成而不是使用
操作\u打开\u文档
操作获取内容
。请记住,对外部存储的文件系统访问在Android 10+上是有限的

如果您使用
ACTION\u GET\u CONTENT
,并且您得到的
Uri
的方案是
file
,那么
getPath()
将是一个文件系统路径


否则,您需要了解您不知道文档来自何处,并且停止考虑“文件的实际路径”。使用
ContentResolver
openInputStream()
将内容复制到您控制的某个文件中,然后使用该文件。

谢谢您的回答!我承认我没有真正了解代码的含义就抓住了它。我会检查那个网站,它看起来真的很有趣。我应该用什么意图来获得真正的路径?也许在应用程序上读取文件本身。但是得到一个真正的文件。。。还是一条真正的路径?@Amg91:“我应该使用哪种意图来获得真正的路径?”——没有。引用我自己的回答,“如果你只想接受文件,那么集成一个”。那么如何正确使用Uri呢?@Foxhunt:这取决于你想用它做什么。例如,您可以使用
ContentResolver
openInputStream()
读取内容。