我需要编写一个Android应用程序,它可以观察文件何时被另一个应用程序修改,然后从中读取数据。文件由用户选择。所以我想使用Intent和设备上可用的任何文件浏览器来让用户选择文件。
ACTION_OPEN_DOCUMENT返回一个URI。我可以打开一个InputStream并将文件读入File的一个示例,然后检查最后修改日期。然而,每隔5秒左右就将文件的内容复制到File的一个示例中,只是为了检查它是否被修改过,这在资源方面似乎很浪费。显然,我不能使用File的示例,从流中复制一次数据来检查最后修改的时间,我必须每次都复制它。
有没有一种方法可以使用URI获取最后修改的时间?或者使用Intent获取实际的文件/绝对路径?我发现了一些非常复杂的方法来从URI获取绝对路径,但它们似乎太复杂了,我还没有找到任何我愿意使用的方法,也没有信心它能在不同版本的Android上工作。
还有别的解决办法吗
3条答案
按热度按时间qmb5sa221#
请注意,对于Android 10或更高版本,您将无法直接使用
file://
。Android正在推动content://
。要从
intent.ACTION_GET_CONTENT
/OPEN_DOCUMENT
/etc之后的URI中提取lastModified
日期,可以使用contentProvider.query()
API。可以提取的可用列为listed in
DocumentsContract.Document
下面是提取最后更新时间的代码:
vojdkbi02#
您也可以使用
DocumentFile.fromSingleUri(context, uri).lastModified()
,它在后台使用相同的代码,而不是手动执行讨厌的ContentResolver
。* 注意:仅适用于KitKat以上版本,因为在早期Android版本上,fromSingleUri返回null
。*xzv2uavs3#
关于这一点的更新。我最终决定使用这段代码从URI中获取文件的绝对路径,并从路径中获取File的示例:https://gist.github.com/asifmujteba/d89ba9074bc941de1eaa
原因是,我绝对需要文件系统上实际文件的最后修改日期。因此,通过InputStream访问它不是一个选择。
我还没有测试它的大量,但似乎是为我的目的和Android的API水平,我已经测试了它的工作。