【问题标题】:Get absolute path from Uri in Android 10在 Android 10 中从 Uri 获取绝对路径
【发布时间】:2020-03-02 11:09:45
【问题描述】:

我正在尝试集成 Imebra 库以在应用程序中加载 .dcm 文件。问题是,根据文档,我需要将文件的绝对路径传递给Imebra,如下所示:

val loadDataSet = CodecFactory.load("myFile.dcm")

为了打开 DCM 文件,我使用以下代码:

 val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
                addCategory(Intent.CATEGORY_OPENABLE)
                type = "*/*"
                putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
            }

            startActivityForResult(intent, RC_OPEN_FILES)

我可以使用以下代码获取所有选定文件的 URI 列表:

 if (data != null) {
                val clipData = data.clipData
                if (clipData != null) {
                    // Multiple files selected
                    val clipDataUriList = arrayListOf<Uri>()
                    for (i in 0 until clipData.itemCount) {
                        clipDataUriList.add(clipData.getItemAt(i).uri)
                    }
                    processDcmFiles(clipDataUriList)
                } else {
                    // Single file selected
                    data.data?.let { processDcmFiles(arrayListOf(it)) }
                }

            }

我尝试使用uri.getPath() 并使用URI 创建File,然后获取绝对路径,但它们似乎都不起作用。

我不确定这是否是在 Android 10 中获取文件绝对路径的正确方法。我们将不胜感激。

【问题讨论】:

  • 那是一种错误的方法。您不会尝试从 uri 获取路径。但是,当您需要文件路径时,您可以做的是先复制到文件系统,然后使用复制文件的路径。
  • @blackapps 你能附上一些链接来说明如何做到这一点吗?
  • 您似乎根本没有阅读此网站,因为您的问题在过去几个月中每天在这里报告两次,请阅读。
  • 但是为获得的 uri 打开一个输入流,为选择的文件路径打开一个输出流。然后从输入读取并将其写入输出。这与复制经典文件大致相同。
  • 好的,我会试试这个。谢谢:)

标签: android android-10.0 storage-access-framework imebra


【解决方案1】:

此示例应用程序使用文件选择器打开和显示文件: https://github.com/binarno/Imebra-V5-Android-Simple-Dicom-Viewer

应用将文件的打开和加载(如有必要)委托给 Android,然后通过 Imebra Pipes 将文件传递给 Imebra。

虽然稍微复杂一些,但它允许 Imebra 也可以从外部来源(例如 Google Drive)读取文件。

免责声明:我是 Imebra 的作者

【讨论】:

  • 我已经浏览过这个示例的代码。问题是我使用的是不支持此功能的旧版 Imebra。使用旧版本的原因是因为我无法在最新版本中应用转换。
  • 根据文档,应用转换的代码包括初始化 VOILUT() 类而不传递任何参数,但相同的代码在与最新版本一起使用时显示错误并要求传入参数构造函数。
  • 另外,voilutTransform.setCenterWidth(vois.get(0).center, vois.get(0).width);显示错误。我无法解决这些错误,因此尝试了不同的方法从 uri 获取绝对路径。
  • VOIs vois = loadDataSet.getVOIs(); // 从数据集中获取对比度设置列表 if(!vois.isEmpty()) { VOILUT transform = new VOILUT(vois.get(0)); }// 使用第一个对比度设置。这在 Imebra 5 的文档中(与 Imebra 4 不同)
  • 为什么不添加一个成员函数来从流中加载?和/或从 uri 加载?然后可以立即使用从 Intent.ACTION_OPEN_DOCUMENT 获得的正常内容 uri。添加这种可能性应该不会太多工作,因为您也已经为文件路径打开了一个流。
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2014-12-03
相关资源
最近更新 更多