【问题标题】:Trash, Delete in new Google Drive Android API?在新的 Google Drive Android API 中删除、删除?
【发布时间】:2014-01-26 21:36:50
【问题描述】:

更新(2015 年 5 月):
“垃圾”功能已在 GDAA 中实现,因此下面的问题无关紧要。

原始问题:
当我使用新的“Google Drive Android API”(GDAA)时,我遇到了一些我无法弄清楚的差异。基本上,我有一个使用“com.google.api.services.drive”接口(插入、补丁、更新)的旧应用程序,我很想将它移植到 GDAA。

首先,GDAA 与 drive.google.com 网络应用程序的对比。
对于旧服务,我使用了 DriveScopes.DRIVE_FILE 范围,因此我假设了类似的行为/结果。我(驱动器所有者)可以在“https://drive.google.com”中删除使用旧“DriveScopes.DRIVE_FILE”创建的文件(我假设我的范围是 DRIVE 那里),随后的 Android 应用程序查询将找不到它们。它的行为与我预期的一样:

  1. Android 应用程序创建文件。
  2. 用户在“drive.google.com”上删除它们。
  3. Android 应用程序不再看到它们。

使用新的 GDAA,它似乎不起作用。这让我想到了第二点:

DELETE/TRASH 功能。
我试图测试 CRUD 功能,但根本找不到 DELETE(同样,这可能是我的无知/短视)。从“drive.google.com”中删除它们会使它们在那里不可见,但 Android 应用仍然可以看到它们。元数据可以通过“isTrashed()”进行查询,但“MetadataChangeSet.Builder”中没有任何内容可以让我删除/删除它们,只有 setMimeType()、setStarred()、setTitle()。

我迷路了,请帮忙。

【问题讨论】:

  • 问题是什么?
  • 纯粹出于好奇,为什么要从 REST API 迁移到本地 API?。我查看了新的 API,并决定坚持使用(大部分)有效的方法。 Drive 和 Android 本地存储之间存在轻微的范式不匹配,因此您只能任由 Google 最终匹配两者。具体来说,我正在考虑 Drive 中可用的所有丰富元数据,这些元数据可能会或可能不会在 Android 中实现。
  • 问题是“新的 GOOGLE DRIVE API 中的删除(或垃圾箱或 setTrash())在哪里?”。您的好奇问题的答案在这里:youtube.com/watch?v=quQyZdhPjxc 和这里:developers.google.com/drive/android/files 我的 Android 应用程序需要向 Google Drive 写入/读取文件,新的 API 应该负责所有同步功能。在这一点上,我可以在我的应用程序中提供自己缺少的功能(可索引、描述、全文),我希望他们能赶上。此外,我喜欢玩新玩具。
  • Google Drive Android API 不支持删除,我们正在为即将发布的下一个版本而努力。
  • @pinoyyid 差不多一年后,我必须承认你是对的。我自己可以更好地管理同步。实际上,GDAA 同步的不可预测性使其变得更加困难。而且设备间更新通知(我愚蠢地希望)无处可寻。 DELETE 在哪里(见上面的评论)?有趣的是,每当我抱怨缺乏支持 (developers.google.com/drive/support) 时,我都会立即被一群智者否决。

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


【解决方案1】:

如果您想完全控制同步,请不要使用 Google Drive Android NEW API(至少目前如此)。它还不够好(2014 年 10 月),或者分别以与“实时”旧 API 不同的方式工作。主要问题是,您无法删除文件,更改不是实时的,元数据经常被缓存很多(当我进行搜索查询时,即使在几个小时后我也可以在结果中看到已删除的文件!)。可能是由于一些优化驱动服务在他们想要的时候以及他们想要的方式运行,所以几乎没有什么是在你的控制之下——你永远不知道驱动服务是如何使用缓存的,你不能强迫驱动服务“现在就做这项工作,因为我需要”。

哦,另一个缺点是,代码比在 OLD API 中创建的相同逻辑要复杂得多 :)

【讨论】:

  • 我最好的成就是在文件夹被删除 3 小时后使用网络驱动器界面在文件夹中创建一个文件。我可以很高兴地将内容、元数据写入 never-never-land 中的文件,而不会出现错误迹象。即使垃圾已在数小时前被手动清空,所有这一切。奇迹发生了……
  • 是的,我也一样。当你不能强制这个新的 API 清除缓存并获得新的结果时,我认为它对于同步的目的是没有用的
  • 是的,一年后仍然没有删除功能,网络上仍然充斥着来自非 GPS 版本的 Android Drive API 的代码/示例/文档,包括来自 @Burcu 的好示例尚未更新。谷歌的缺点是不断的发展意味着一切都是一个移动的目标,并且文档不断过时。我已经设法将 Burcu 的 appdatapreferences 代码转换为新的 API,但仍在努力完全工作。希望新的一年能带来一些新的文档和示例。
【解决方案2】:

Google Drive Android API 不会立即与远程资源同步。根据调度程序,同步可能需要一段时间。调度取决于 Android 的帐户同步组件,这些组件确保网络带宽和电池寿命得到保存和有效利用。

此外,从开发者预览版开始,我们不支持删除或丢弃。但是,下一个版本可能会支持这些操作。

【讨论】:

  • 关于删除功能的任何大致时间表?
  • 有没有办法强制刷新/重新同步?
【解决方案3】:

如果您正在使用应用程序文件夹(用户不可见),您删除文件的目标只是为了节省用户空间,并且永远不会再次选择它。因此,您可以使用“清空并忘记”策略。

来自@Mark Carter(因为 Android Drive API 已更改):

    private void deleteContents(final DriveFile driveFile) {
    driveFile.open(this.client, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
        @Override
        public void onResult(DriveApi.DriveContentsResult result) {
            if (!result.getStatus().isSuccess()) {
                // oh noes!
                return;
            }

            final DriveContents contents = result.getDriveContents();                

            try {
                MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder().setTitle("deleted").build();
                contents.commit(PhotoAdapter.this.client, metadataChangeSet).setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status status) {
                        if (!status.isSuccess()) {
                            // more oh noes!
                            return;
                        }
                        // nicely marked, now destroy data
                        OutputStream out = contents.getOutputStream();
                        try {
                            out.write(0x0);
                            //nicely empty
                        } catch (IOException e) {
                            //oh, no...
                            throw new RuntimeException(e);
                        }finally {
                            try {
                                out.close();
                            } catch (IOException e) {
                                //what we can do? Just log it
                            }
                        }
                    }
                });
            }
            catch (Exception e) {
                //Unsuccessful. Log it, rollback  contents and cry
                contents.discard(PhotoAdapter.this.client);
            }
        }

    });
}

【讨论】:

  • OutputStream out = contents.getOuputStream(); 上抛出 IllegalStateException --- Drive Docs 说 Once this DriveContents instance has been committed, used for creation, or discarded, it becomes closed and any subsequent method call will throw an IllegalStateException.
  • 抱歉,我提交的代码还没有经过测试。我稍后在我的项目中修复了它,但忘记在此处更新它。我会尽快发布更新。
【解决方案4】:

虽然 Google Drive Android API 尚不支持删除,但您可以删除内容(同时,重命名标题,以便您以后可以忽略它)。这可能对使用 AppFolder 的开发人员有用。

private void deleteContents(final DriveFile driveFile) {
  driveFile.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
    @Override
    public void onResult(DriveContentsResult result) {
      if (!result.getStatus().isSuccess()) {
        // oh noes!
        return;
      }
      DriveContents contents = result.getDriveContents();
      try {
        MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder().setTitle(DELETED_DRIVE_TITLE).build();
        contents.commit(mGoogleApiClient, metadataChangeSet).setResultCallback(
                new ResultCallback<Status>() {
                  @Override
                  public void onResult(Status status) {
                    if (!status.isSuccess()) {
                      // more oh noes!
                      return;
                    }
                    // nicely deleted
                  }
                });
      }
      catch (Exception e) {
        contents.discard(mGoogleApiClient);
      }
    }
  });
}

【讨论】:

  • 我可以忽略它,但我的用户会看到他们驱动器中的“已删除”文件桶占用报价。问题的重点是戳 Google 员工。
  • 是的,只有在使用 AppFolder 时才有用。
  • API 改变了一点(再次)。我重写了您的代码@Mark Carter(请参阅下面我的答案中的代码)。
  • 好吧,伙计! :) 我以为你已经走了很长时间了……哈哈
【解决方案5】:

新版 Google Play 服务(7.0.0 / 2015 年 3 月)终于推出了DriveRessource.trash()。见https://developer.android.com/reference/com/google/android/gms/drive/DriveResource.html

尚未测试 - 我会尽快报告。

// 编辑 好吧,我对其进行了测试,它确实有效……但不适用于 app 文件夹中的文件:Cannot trash App Folder or files inside the App Folder. 显然,您在使用 app 文件夹时无法使用此功能。

【讨论】:

    【解决方案6】:

    @Burcu Dogan,不确定您是否会看到这个,但根据https://github.com/googledrive/android-demos/issues/4#issuecomment-33759142,是否会有从服务运行 GDrive 操作的示例?

    【讨论】:

    • 让我超时,再试一次:您可以尝试从此处的“AsyncTask”“doInBackground”中提取一些代码。 github.com/seanpjanson/140201-GDAA/blob/master/awaits/… 它可以作为服务工作。至少我打算使用类似的东西。根目录下的readme.txt中有一点叙述。
    • 谢谢,我去看看。但我意识到删除还没有实现。我的意思是暂时搁置转换到新的 api
    • 是的,而且(每个问题 github.com/googledrive/android-demos/issues/3),删除驱动器中的文件并期望在 Android 上看到它是非常不可靠的(这就是我实际上写了 140201-GDAA 的原因)。但这是一个好的开始,我猜他们很快就会修复/支持它。
    【解决方案7】:

    从 Google Play 服务 7.5 开始,支持删除和回收站: https://developers.google.com/drive/release-notes#drive_android_api_google_play_services_75_-_may_28th_2015

    我们建议对用户可见的文件使用回收站而不是删除,以便用户有机会恢复任何意外丢弃的内容。删除是永久性的,建议仅用于应用文件夹内容,其中没有回收站。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多