我需要编写一个Android应用程序,观察其他应用程序修改文件的时间,然后从中读取数据。该文件由用户选择。所以我想使用Intent以及设备上可用的文件选择器供用户选择文件。
使用Intent.ACTION_OPEN_DOCUMENT执行此操作会返回一个URI。我可以打开一个InputStream并将文件读入File的一个实例,然后检查上次修改日期。但是,每隔5秒左右将文件内容复制到File实例中只是为了检查它是否被修改在资源方面似乎是浪费。我显然不能使用File的实例和从流中复制一次的数据来继续检查上次修改时间,我每次都要继续复制它。
有没有办法使用URI获取上次修改时间?或者使用Intent获取实际的文件/绝对路径?我发现了一些从URI中获取绝对路径的非常复杂的方法,但它们看起来太复杂了,我没有找到任何我愿意使用的东西,并且相信它会在不同版本的Android上运行。
还有其他解决方案吗?
答案 0 :(得分:1)
请注意,对于Android 10及更高版本,您将无法直接使用file://。 Android正在推动content://。
要从intent.ACTION_GET_CONTENT / OPEN_DOCUMENT / etc之后的URI中提取lastModified日期,可以使用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")
}
答案 1 :(得分:0)
对此进行更新。我最后决定使用这段代码从URI中获取文件的绝对路径,并从路径中获取File的实例:https://gist.github.com/asifmujteba/d89ba9074bc941de1eaa
原因是,我绝对需要文件系统上实际文件的最后修改日期。因此,不能通过InputStream访问它。
我没有对它进行过大量测试,但似乎是为了我的目的而工作,并且在我测试过的Android API级别上。