【问题标题】:Google Drive Android API - Access app-created files and folders across devicesGoogle Drive Android API - 跨设备访问应用创建的文件和文件夹
【发布时间】:2014-03-19 19:27:51
【问题描述】:

据我了解,使用新的GDAA,为了访问文件夹及其内容,您必须拥有该文件夹的DriveId - 因为这确保应用程序只能访问它自己创建的内容。

现在,我的应用将文件上传到用户的 Google Drive 帐户(图片)的自定义文件夹中。首次创建此文件夹时,我将文件夹的 DriveId 保存到 Shared Preferences,以便以后可以访问该文件夹以进行更多上传。我的问题是我希望用户能够从多个设备访问图片(例如,他/她可以在平板电脑上查看从他/她的手机上传的图片,反之亦然),但我不能这样做两个设备上都没有文件夹的 DriveId。我能想到的唯一解决方案是通过一些云服务在用户设备之间共享 DriveId,但这似乎非常不方便。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    无耻地把自己推销为谢丽尔的搭档,我可以给你一些具体的观点,因为我以前经历过这个挑战。这就是我所做的:

    1. 在系统根目录中为我的应用程序创建一个唯一的“根目录” - “MyStupidAppRoot”。在这里您将遇到主要挑战,因为您是按名称创建它,如果您基于它不存在创建它,您可以不能可靠地检查它。但它正在变得更好,请参阅SO 22382099SO 22515028
    2. 一旦有了可靠的锚点“MyStupidAppRoot”,您就可以创建 Cheryl 提到的 AppFolder(尚不可用)或创建自己的可见文件(同样,唯一的创造挑战),可以保留任何你想要的东西。比如你所有的 PREFERENCE 字符串。我什至勇敢地在那里存储了完整的 SQLite DB 文件。这是可能的,因为您将 byte[] 缓冲区写入文件。
    3. 然后,任何其他装有您应用程序的设备都可以找到“MyStupidAppRoot”,从那里获取资源文件并读取它。

    需要注意的是,你自己的文件夹/文件和 AppFolder 的主要区别在于,用户无法读取 AppFolder 的内容,但仍然可以删除它

    以下是如何将 byte[] 缓冲区写入文件。为了简单起见,它是 'await' 版本,但有一个 async 版本 'createFileAsync()' here

     public DriveFile createFileWait(DriveFolder fldr, String name, String mime, byte[] buff) {
      DriveFile drvFile = null;
      if (isConnected()) try { 
        ContentsResult rslt = Drive.DriveApi.newContents(_gac).await();
        if (rslt.getStatus().isSuccess()) {
          Contents cont = rslt.getContents();    
          cont.getOutputStream().write(buff);
          MetadataChangeSet meta = (mime == null) ?
              new MetadataChangeSet.Builder().setTitle(name).build() :
              new MetadataChangeSet.Builder().setTitle(name).setMimeType(mime).build();
          drvFile = fldr.createFile(_gac, meta, cont).await().getDriveFile();
        }
      } catch (Exception e) {}
      return drvFile;
    }
    

    关于 ID:

    您上面提到的 DriveId 是一个对象,可以转换为 SO 21800257 中讨论的 2 个不同的字符串。这取决于你选择哪一个。 'encodeToString()'中的长的更容易被'decodeFromString()'转回DriveId,较短的可以在http地址中轻松识别,但需要async / await方法来取回DriveId - fetchDriveId() .

    【讨论】:

    • 如果这听起来像是一种无耻的自我推销,相信我,它是:因为你可能和我经历了同样的迷宫,我建议你从 github 上拉代码 @987654325 @ 测试你所有的理论,并在它们在你的应用程序中遇到你之前发现障碍。它是一个没有 UI 的单一文件,涵盖了所有主要功能。 AsyncTask 中的“等待”版本应该很容易逐步完成。
    • 在 Jakob:我脑海中又浮现出一件事:如果您的应用处理多个帐户,将配置保存在 Drive 的已知位置可以让您为每个帐户下载正确的应用状态用户。
    • 以一种与提问方式完全无关的方式,您的回答帮助了我,所以这是我的赞成票^_^
    【解决方案2】:

    您不一定必须拥有 DriveId,它只是最可靠的方法,因为它唯一地标识了文件夹。您也可以根据标题进行查询,尝试找到相同的文件夹。假设 Web 和 Android 应用共享一个应用 ID,则两者都应该能够访问相同的文件。

    在应用程序之间共享状态的一个简单选择是利用新启动的应用程序文件夹(在网络上称为应用程序数据文件夹)。这是一个隐藏文件夹,您可以在其中存储特定于您的应用程序的文件。它还没有出现在 Android 文档中,但它应该会在 Google Play Services 4.3 发布后立即出现。见http://android-developers.blogspot.com/2014/03/google-play-services-43.html

    【讨论】:

    • 嗯,好的。非常感谢你。几乎可以肯定有一些限制说该应用程序只能访问“自行创建”的文件,但很棒。而且我只是喜欢播放服务如何不断变得更好。我想我会选择那个 list-all-files-and-look-for-my-folder 解决方案,哈哈。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多