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

Posted

技术标签:

【中文标题】Android - 获取从文件资源管理器中选择的 .txt 文件的真实路径【英文标题】:Android - Get real path of a .txt file selected from the file explorer 【发布时间】:2018-08-19 15:38:19 【问题描述】:

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

【问题讨论】:

***.com/a/59104787/3141844 【参考方案1】:

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

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

外部存储上的本地文件 另一个应用程序的内部存储上的本地文件 可移动存储上的本地文件 已加密且需要即时解密的本地文件 数据库的BLOB 列中保存的字节流 需要其他应用先下载的一段内容 ...等等

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

你没有。

如果您只想接受文件,请集成 a file chooser library 而不是使用 ACTION_OPEN_DOCUMENTACTION_GET_CONTENT。请记住,在 android 10+ 上,文件系统对外部存储的访问受到限制。

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

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

【讨论】:

感谢您的回答!我承认我在不知道代码含义的情况下抓取了代码。我会检查那个网站,它看起来真的很有趣。 我应该使用哪个 Intent 来获取真实路径?也许在应用程序上读取文件本身。但是要获得一个真实的文件......还是一个真实的路径? @Amg91:“我应该使用哪个 Intent 来获取真实路径?” - 空无一人。从我的回答中引用我自己的话,“如果您只想接受文件,请集成 file chooser library”。 那么如何正确使用Uri呢? @Foxhunt:这取决于你想用它做什么。例如,您可以使用ContentResolveropenInputStream() 来读入内容。

以上是关于Android - 获取从文件资源管理器中选择的 .txt 文件的真实路径的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何从日期和时间选择器中获取值

从任务管理器中隐藏 Android 应用程序 [重复]

android获取联系人图片、姓名和手机号码

如何让我的应用出现在应用选择器中?

如何从 Eclipse 插件中获取包资源管理器中的选定节点

无法从 C# 和图形资源管理器中的 Sharepoint 图形获取驱动器项目和驱动器文件夹