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

时间:2018-03-11 14:51:01

标签: java android file android-activity path

我正在开发一个应用程序,我希望能够在.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。如何获得文件的真实路径?

2 个答案:

答案 0 :(得分:4)

  

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

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

  • 外部存储设备上的本地文件
  • 其他应用的内部存储上的本地文件
  • 可移动存储上的本地文件
  • 加密且需要动态解密的本地文件
  • 数据库中BLOB列中保存的字节流
  • 首先需要由其他应用下载的内容
  • ......等等
  

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

你没有。

如果您只想接受文件,请集成a file chooser library,而不是使用ACTION_OPEN_DOCUMENTACTION_GET_CONTENT。请记住,文件系统对外部存储的访问计划与Android Q一起消失。

如果您使用ACTION_GET_CONTENT,并且Uri的方案是file,则getPath()将成为文件系统路径。

否则,您需要了解您不知道文档来自哪里,并且不再考虑“文件的真实路径”。使用ContentResolveropenInputStream()将内容的副本复制到您控制的某个文件中,然后使用该文件。

答案 1 :(得分:0)

Android无法从设备读取文件的真实路径 我建议您使用此库选择文件

实现'com.droidninja:filepicker:2.2.1' FielPicker