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

时间:2018-01-27 07:19:05

标签: android android-intent uri android-file

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

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

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

还有其他解决方案吗?

2 个答案:

答案 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级别上。