文件上次修改时间来自Intent.ACTION_OPEN_DOCUMENT提供的安卓 URI



我需要编写一个Android应用程序,观察文件何时被另一个应用程序修改,然后从中读取数据。该文件由用户选择。所以我想使用Intent以及设备上可用的文件选择器供用户选择文件。

使用 Intent.ACTION_OPEN_DOCUMENT 执行此操作将返回一个 URI。我可以打开一个输入流并将文件读入文件实例,然后检查上次修改日期。但是,每隔 5 秒左右将文件的内容复制到 File 的实例中,只是为了检查它是否已被修改,这似乎在资源方面是浪费。我显然不能使用从流中复制一次数据的 File 实例来继续检查上次修改时间,我每次都必须继续复制它。

有没有办法使用 URI 获取上次修改时间?还是使用 Intent 获取实际文件/绝对路径?我发现了一些非常复杂的方法,可以从URI获取绝对路径,但它们似乎太复杂了,我还没有找到任何我愿意使用的东西,并且有信心它可以在不同版本的Android上运行。

还有其他解决方案吗?

请注意,对于Android 10+及更高版本,您将无法直接使用 file://。Android正在推动 content://。

以在意图之后从 URI 中提取上次修改日期。ACTION_GET_CONTENT/OPEN_DOCUMENT/etc,您可以使用 contentProvider.query()

可以提取的可用列列在 DocumentsContract.Document (https://developer.android.com/reference/android/provider/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")
}

对此的更新。我最终决定使用这段代码从 URI 获取文件的绝对路径,并从路径中获取文件的实例:https://gist.github.com/asifmujteba/d89ba9074bc941de1eaa

原因是,我绝对需要文件系统上实际文件的上次修改日期。因此,通过输入流访问它不是一种选择。

我还没有对它进行大量测试,但似乎正在为我的目的工作,并且在 Android API 级别上我已经测试了它。

除了手动浏览讨厌的ContentResolver,您还可以使用在引擎盖下使用相同的代码的DocumentFile.fromSingleUri(context, uri).lastModified()注意:仅适用于KitKat以后,因为fromSingleUri在早期的Android版本上返回null

最新更新