Intent.ACTION_OPEN_DOCUMENT提供的Android URI中的文件上次修改时间

jaql4c8m  于 2023-10-14  发布在  Android
关注(0)|答案(3)|浏览(141)

我需要编写一个Android应用程序,它可以观察文件何时被另一个应用程序修改,然后从中读取数据。文件由用户选择。所以我想使用Intent和设备上可用的任何文件浏览器来让用户选择文件。
ACTION_OPEN_DOCUMENT返回一个URI。我可以打开一个InputStream并将文件读入File的一个示例,然后检查最后修改日期。然而,每隔5秒左右就将文件的内容复制到File的一个示例中,只是为了检查它是否被修改过,这在资源方面似乎很浪费。显然,我不能使用File的示例,从流中复制一次数据来检查最后修改的时间,我必须每次都复制它。
有没有一种方法可以使用URI获取最后修改的时间?或者使用Intent获取实际的文件/绝对路径?我发现了一些非常复杂的方法来从URI获取绝对路径,但它们似乎太复杂了,我还没有找到任何我愿意使用的方法,也没有信心它能在不同版本的Android上工作。
还有别的解决办法吗

qmb5sa22

qmb5sa221#

请注意,对于Android 10或更高版本,您将无法直接使用file://。Android正在推动content://
要从intent.ACTION_GET_CONTENT/OPEN_DOCUMENT/etc之后的URI中提取lastModified日期,可以使用contentProvider.query() API。
可以提取的可用列为listed in DocumentsContract.Document
下面是提取最后更新时间的代码:

contentResolver.query( uri, null, null, null, null  )?.use { c ->

    val dateMod: Long = try {
        val colDateModified = c
            .getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_LAST_MODIFIED)
        c.moveToFirst()
        c.getLong(colDateModified)
    } catch (e: Exception) {
        0
    }
    print("Date modified : $dateMod")
}
vojdkbi0

vojdkbi02#

您也可以使用DocumentFile.fromSingleUri(context, uri).lastModified(),它在后台使用相同的代码,而不是手动执行讨厌的ContentResolver。* 注意:仅适用于KitKat以上版本,因为在早期Android版本上,fromSingleUri返回null。*

xzv2uavs

xzv2uavs3#

关于这一点的更新。我最终决定使用这段代码从URI中获取文件的绝对路径,并从路径中获取File的示例:https://gist.github.com/asifmujteba/d89ba9074bc941de1eaa
原因是,我绝对需要文件系统上实际文件的最后修改日期。因此,通过InputStream访问它不是一个选择。
我还没有测试它的大量,但似乎是为我的目的和Android的API水平,我已经测试了它的工作。

相关问题