代码之家  ›  专栏  ›  技术社区  ›  Nicolas

来自Google Drive的持久SAF URI在几天后发生更改,内容无法访问

  •  1
  • Nicolas  · 技术社区  · 5 年前

    我正在持久化通过SAF获得的URI,启动的目的如下:

    val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
        .setType("application/json")
        .putExtra("android.content.extra.SHOW_ADVANCED", true)
        .putExtra("android.content.extra.FANCY", true)
        .putExtra("android.content.extra.SHOW_FILESIZE", true)
        .addCategory(Intent.CATEGORY_OPENABLE)
        .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION or
            Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
    

    我没有使用 Intent.FLAG_GRANT_READ_URI_PERMISSION flag,因为我不需要它。这最初有效,在活动被破坏后继续有效,至少持续几天。几天后:

    • 保存到我的数据库中的URI显然不再有效。 ContentResolver.persistedUriPermissions 没有显示。但是,该文件没有移动,也没有重命名。
    • ContentResolver.persistedUriPermissions 确实返回了一些URI,但没有一个可以解析,尽管据称是持久化的。我遇到的错误 contentResolver.openOutputStream(uri) 是:“未能找到com.google.android.apps.docs.storage的提供商信息”(就好像前一天没有找到一样!)。

    我目前只使用Google Drive进行了测试,所以我认为问题与此有关。我正在使用本地存储进行测试,但我必须等几天才能看到结果。同时:我是否遗漏了意向书上的重要标志?将URI保存为字符串是否正确?这件事发生在其他人身上了吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Marcus Hultman    4 年前

    我也在讨论这个问题。从Files应用程序中选择Uris似乎没问题,但我作为Strings坚持使用的Google Drive Uris将在一个小时左右后停止工作(看似随机的延迟,但在应用程序重新启动后)。在应用程序启动时,我可以看到Uri仍然由返回 getPersistedUriPermissions() ,但在中使用时 mediaMetadataRetriever.setDataSource(context, uri) 它会抛出一个 IllegalArgumentException 。之后,它将不会由返回 getPersistedUriPermissions() 如果我再次尝试访问它,它会抛出 java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA .