【问题标题】:How to get DriveId of created folder in Google Drive Android API如何在 Google Drive Android API 中获取已创建文件夹的 DriveId
【发布时间】:2014-03-05 13:43:29
【问题描述】:

我的 Google Drive 帐户中有文件夹,我想在特定文件夹中添加文件。我该怎么做?在example 中需要 DriveId (EXISTING_FOLDER_ID),但我不知道 DriveID 我的文件夹,我只知道名称。

【问题讨论】:

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


    【解决方案1】:

    好的。我在 Github 上的 Drive 演示中遇到了同样的问题:https://github.com/googledrive/android-demos

    在自述文件的底部,它说:

    如果你真的想运行这个示例应用程序(虽然它主要是 提供以便您可以阅读代码),您将需要注册一个 OAuth com.google.android.gms.drive.sample.demo 包的 2.0 客户端,使用您自己的调试密钥,并将任何资源 ID 设置为您的资源 ID 可使用。资源 ID 定义开启:

    com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FOLDER_ID com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FILE_ID

    他们并没有真正指定应该如何获取和设置 BaseDemoActivity 文件中定义的 EXISTING_FOLDER_ID 和 EXISTING_FILE_ID 常量的资源ID,在阅读了上面的 seanpj 评论后,我使用他的方法 3 来查找 DriveID,以便我可以将其添加到演示应用程序中,使其正常运行。

    只需在您的 PC 上转到云端硬盘,然后点击顶部的“链接”按钮。

    链接的一部分显示“id=XXXXXXXXXXX”。将其复制并粘贴到演示应用程序的 BaseDemoActivity 文件中。对您在云端硬盘上自己创建的文件和文件夹执行此操作。

    演示应用现在应该可以成功运行了。

    【讨论】:

    • 我在重复自己,但问题是有问题的文件必须由 DEMO 应用程序本身创建。 GDAA 仅支持 FILE 范围,即只能使用由它创建的文件/文件夹。在一个松散相关的事情上,我在 Github 上放了一段测试代码,除了官方的 DEMO 之外可能会有用(它更简单)。欢迎您逐步完成。 github.com/seanpjanson/GDAADemo
    【解决方案2】:

    @smokybob。我不知道它是否有助于解决原始问题,但根据您的评论:

    这是一个代码 sn-p,它应该可以让您获得文件夹/文件 DriveId。 'title'、'mime' 和 'fldr' 参数是可选的。如果您为“fldr”传递 null,则搜索是全局的(在应用程序的 FILE 范围内),否则在指定的文件夹内(但不在子文件夹内)。它使用最简单的 - 'await()' 风格,必须从 UI 线程中运行。

    但请注意,文件夹/文件名在 Google Drive Universe 中并不是唯一的实体。 您可以在一个文件夹中拥有多个同名的文件/文件夹!

    GoogleApiClent _gac;   // initialized elsewhere
    
    //find files, folders. ANY 'null' ARGUMENT VALUE MEANS 'any'
    public void findAll(String title, String mime, DriveFolder fldr) {
      ArrayList<Filter> fltrs = new ArrayList<Filter>();
      fltrs.add(Filters.eq(SearchableField.TRASHED, false));
      if (title != null)  fltrs.add(Filters.eq(SearchableField.TITLE, title));
      if (mime  != null)  fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
      Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build(); 
      MetadataBufferResult rslt = (fldr == null) ? 
        Drive.DriveApi.query(_gac, qry).await() : 
        fldr.queryChildren(_gac, qry).await();
      if (rslt.getStatus().isSuccess()) {
        MetadataBuffer mdb = null;
        try { 
          mdb = rslt.getMetadataBuffer();
          if (mdb != null) {
            for (Metadata md : mdb) {
              if (md == null) continue;
              DriveId dId  = md.getDriveId();      // here is the "Drive ID"         
              String title = md.getTitle();
              String mime  = md.getMimeType();
              // ...
            }
          }
        } finally { if (mdb != null) mdb.close(); } 
      }
    }
    

    一般来说,您可以从以下位置获取所需的“DriveId”:

    1. 文件/文件夹名称如上代码所示,或
    2. 您从“encodeToString()”获得的字符串标识符。例如,我用它来缓存 MYROOT 文件夹 ID,或者
    3. 您从“getResourceId()”获得的字符串标识符。这是您在 html 地址中看到的字符串。但由于您唯一的作用域是 FILE,因此不要指望使用它来打开不是您的应用创建的内容。

    2 和 3 标识符都是字符串,因此可能会混淆。检索驱动器 ID(通过 decodeFromString())时,标识符 2 更快。标识符 3 的检索速度较慢(通过 fetchDriveId()),但如果您需要将您的 ID 带到其他地方(例如,Apps 脚本),它会很有用。另见SO 21800257

    就文件/文件夹的创建而言,我在GitHub here 上有一些代码。如果您查看 awaits\MainActivity.java ... buildTree(),您将看到在构建简单文件夹树时递归地创建文件夹/文件。

    【讨论】:

    • GitHub 页面未找到·
    • 我已经退休了。这里还有一个GDAADemo,不过我有一段时间没碰了,GDAA可能已经进化了。
    【解决方案3】:

    您可以使用查询来查找文件夹

    Query query = new Query.Builder().addFilter(Filters.and(
                    Filters.eq(SearchableField.TITLE, "folder name"),
                    Filters.eq(SearchableField.TRASHED, false))).build();
    

    我找到了一个示例教程 http://wiki.workassis.com/android-google-drive-api-deleted-folder-still-exists-in-query/ 在本教程中,它们是异步调用的

    【讨论】:

      【解决方案4】:

      如果您有文件夹的元数据(或 DriveFolder 对象,您可以从中获取元数据),您只需调用 getDriveId

      如果您有网络资源,您可以使用 fetchDriveId 使用该资源 id 获取 DriveId

      【讨论】:

      • 我认为归结起来的问题是:当我只知道文件夹名称(又名标题)时,如何获取文件夹的 DriveId 并向其中添加文件?
      • 在这种情况下,您可以使用查询 API 搜索具有该标题的文件夹:developer.android.com/reference/com/google/android/gms/drive/…, com.google.android.gms.drive.query.Query)
      • 那么我可以获取不是通过我的应用程序创建的文件夹,而是通过网络接口Google Drive
      • 您的应用程序需要获得授权才能查看该文件夹。您可以通过要求用户通过 OpenFileActivity 选择一个文件夹来执行此操作,您可以在其中将 mimeType 限制为文件夹 mimeType。 developer.android.com/reference/com/google/android/gms/drive/…
      • @Werder 因为我们谈论的是新的 Google Drive Android API,所以我相信您只能使用您的应用创建的文件来“开派对”,因为只支持 FILE 范围。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      相关资源
      最近更新 更多