我正在使用 SAF 在 android 上处理文件,我认为一切正常,除了在 EMUI 10 上运行的华为设备上,我发现在输出流上写入时文件被复制。
我手动构建文档 uri 的路径,因为当我使用“findFile()”时,需要几分钟来遍历我需要的所有文件(超过 1000 个)。与 File 对象比较只需不到 1 秒。
如何手动构建路径 Uri
@Synchronized
fun getAsset(uuid: String): Uri =
Uri.parse("${assetsFolder!!.uri}%2F$uuid") // assetsFolder!!.findFile(uuid).uri takes minutes
现在在下面的方法中,方法“exists”返回 false,当文件创建时,它在最后返回一个重复的计数器。
@Synchronized
fun requireAsset(context: Context, uuid: String): DocumentFile {
val uri = getAsset(uuid)
val doc = toDocumentFile(context, uri)
return if (doc.exists())
doc
else {
return assetsFolder!!.createDirectory(MIME, uuid)!!
}
}
fun toDocumentFile(context: Context, uri: Uri): DocumentFile =
try {
DocumentFile.fromTreeUri(context, uri)!!
} catch (e: IllegalArgumentException) {
DocumentFile.fromFile(File(uri.path!!))
}
由于“exists()”返回 false,我尝试使用指定的 UUID 创建一个文件,但结果将是重复文件。当我使用文件管理器进行检查时,我可以在其中看到两个文件(文件 A 和文件 A (1))。有时,我猜“exists()”可以正常工作,因为我没有得到重复的计数器,但非常罕见。这个问题出现在华为 EMUI 10 设备上。
requestLegacyExternalStorage 也被启用 android:requestLegacyExternalStorage="true"