2

我正在使用 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"

4

0 回答 0