在Android 10中,如何从Uri获取绝对路径?

3

我正在尝试将 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列表:

我能够使用下面的代码获取所有选中文件的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
@blackapps,你能否附上一些展示如何完成这个任务的链接? - Mehul Kanzariya
看起来你根本没有阅读这个网站,因为你的问题在过去几个月里已经有两次被报告了,请仔细阅读。 - blackapps
但是要为获取的URI打开一个输入流,为选择的文件路径打开一个输出流。然后从输入中读取并将其写入输出。这与复制经典文件几乎相同。 - blackapps
好的,我会尝试这个。谢谢 :) - Mehul Kanzariya
这个答案对我所有的情况都有效: https://stackoverflow.com/a/63032934/12401637 - gowtham6672
1个回答

0

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

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

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

声明:本人是 Imebra 的作者。


根据文档,应用转换的代码包括初始化VOILUT()类而不传递任何参数,但是当使用最新版本时,相同的代码会显示错误,并要求在构造函数中传递参数。 - Mehul Kanzariya
此外,行voilutTransform.setCenterWidth(vois.get(0).center, vois.get(0).width);显示错误。我无法解决这些错误,因此尝试了不同的方法来从URI获取绝对路径。 - Mehul Kanzariya
1
VOIs vois = loadDataSet.getVOIs(); // 从数据集中获取对比度设置列表 if(!vois.isEmpty()) { VOILUT transform = new VOILUT(vois.get(0)); }// 使用第一个对比度设置。这在Imebra 5的文档中有说明(与Imebra 4不同) - Paolo Brandoli
@blackapps 这个库完全是用C++编写的,Java包装器是由Swig自动生成的。 - Paolo Brandoli
@PaoloBrandoli 非常感谢。评论中的解决方案起作用了。我一直在尝试解决这个问题已经三天了 :) - Mehul Kanzariya
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接