【问题标题】:Where did the "createFromResourceId()" go?“createFromResourceId()”去哪儿了?
【发布时间】:2014-03-15 01:08:39
【问题描述】:

我已更新到新版本的 Google Play Services 4.2(库版本 15)。突然之间,对 DriveId.createFromResourceId("....") 的调用没有得到解决。

DriveId sFolderId = DriveId.createFromResourceId("0B2EE......N3J6RU0"); 

我知道我可以使用 DriveIdencodeToString() / decodeFromString(),但是:

  1. ResourceId 直接对应 Google Drive 中文件的 http。
  2. 即使文件被操作也似乎是持久的

documentationdemo code 都广泛使用该方法。此外,镜像方法 getResourceId() 仍然存在。
不仅仅是一个问题,它是 Google Drive / Google 的澄清请求玩 Svcs 伙计们。

【问题讨论】:

    标签: android google-drive-api google-play-services


    【解决方案1】:

    我测试了 Burcu 的答案,不幸的是它没有用。或者也许我错误地表达了这个问题。我会尝试重新措辞(我找到了正确答案)。

    DriveId 有 2 种不同的字符串类型 ID 表示(文件和文件夹)。

    1/ DriveId.encodeToString(), resulting in something like:
    "DriveId:CAESHDBCMW1RVVcyYUZKZmRhakIzMDBVbXMYjAUgssy8yYFRTTNKRU55"
    2/ and DriveId.getResourceId(), resulting in shorter:
    "UW2aFJfdajB3M3JENy00Ums0B1mQ"
    

    在 4.1 中,有两种方法可以将它们转回 DriveId

    1/ DriveId.decodeFromString(DriveId.encodeToString());
    2/ DriveId.createFromResourceId(DriveId.getResourceId());
    

    它们都成对正常工作,我选择了 ResourceId 品种,因为这个短字符串出现在其他系统(Apps 脚本...)中使用的 http 地址中。例如: https://docs.google.com/file/d/UW2aFJfdajB3M3JENy00Ums0B1mQ
    此外,即使文件在 Google 云端硬盘中被操作(已删除、恢复、移动),它也似乎是持久的。

    但在 4.2 中,createFromResourceId() 消失了,不能 被“decodeFromString()”替换,如下所示:

    //INCORRECT    
    DriveId.decodeFromString(DriveId.getResourceId());
    

    相反,必须以这种方式检索来自 ResourceId 的 DriveId:

    DriveIdResult result = Drive.DriveApi.fetchDriveId(GAC, DriveId.getResourceId()).await();
    DriveId drvID = result.getDriveId();
    

    (为了简单起见,我使用“await”版本)。

    所以结论是: createFromResourceId() 被替换为

    Drive.DriveApi.fetchDriveId(GAC, DriveId.getResourceId()).await().getDriveId()
    

    需要注意的是,“await()”构造应该作为普通 UI 线程中的回调来实现。

    更新(2014-10-23)

    上面的答案比较陈旧,请参考下面的cmets。

    【讨论】:

    • 你是对的,fetchDriveId 替换了 createFromResourceId。对困惑感到抱歉。 resourceId 与 Drive API 的 Web 版本中使用的 ID 相匹配,而 DriveId(及其上的 encodeToString 方法)对一些附加信息进行编码。如果您想使用除 Android API 之外的 Web API,请使用 resourceId,否则使用 DriveId 和 encodeTo/FromString。
    • 谢谢 Cheryl,您能否继续介绍 DriveID 的持久性(较长的)?换句话说,我可以将它存储在我的应用程序的持久存储(例如 SQLite)中并稍后引用它吗?在我看来,“解码”比“fetchDriveId”方法更快。
    • 是的,这就是 encodeToString 的意图。它应该在文档中说明。
    • 你让我免于痛苦。谢谢
    • 请注意,DriveId 的字符串表示将根据资源是否已上传而改变,因此如果您要进行比较,您应该始终使用 DriveId.equals() 而不是直接比较字符串。可以直接比较 ResourceId 字符串,但是这些字符串只有在资源上传后才可用。
    【解决方案2】:

    createFromResourceId 重命名为decodeFromString

    DriveId sFolderId = DriveId.decodeFromString("0B2EE......N3J6RU0"); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2015-07-17
      • 2012-10-30
      • 2013-05-23
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多