垃圾邮件,删除新的Google云端硬盘Android API?

时间:2014-01-26 21:36:51

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

更新(2015年5月):
'垃圾'功能已在GDAA中实施,使下面的问题无关紧要。

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

首先,GDAA与drive.google.com网络应用。
使用旧服务,我使用了DriveScopes.DRIVE_FILE范围,因此我假设了类似的行为/结果。使用旧" DriveScopes.DRIVE_FILE"创建的文件可以由我(驱动程序所有者)删除" https://drive.google.com" (我假设我的范围是DRIVE那里),后续的Android应用程序查询将无法找到它们。它表现得像我期望的那样:

  1. Android应用创建文件。
  2. 用户在" drive.google.com"上删除它们。
  3. Android应用程序不再看到它们了。
  4. 使用新的GDAA,它似乎不起作用。这让我想到了第二点:

    DELETE / TRASH功能。
    我试图测试CRUD功能,根本找不到DELETE(再次,这可能是我的无知/短视)。从" drive.google.com"中删除它们让它们在那里看不见,但Android应用程序仍然可以看到它们。元数据可以通过" isTrashed()"查询,但是" MetadataChangeSet.Builder"这将让我删除/删除它们,只有setMimeType(),setStarred(),setTitle()。

    我迷路了,请帮帮忙。

7 个答案:

答案 0 :(得分:5)

如果您希望完全控制同步,请不要使用Google Drive Android NEW API(至少目前为止)。它还不够好(2014年10月),或者分别以不同于"实时"旧API 。主要的问题是,您无法删除文件,更改不是实时的,元数据经常被缓存(当我进行搜索查询时,结果我甚至可以在很长时间后看到已删除的文件!)。可能由于一些优化驱动器服务在他们想要和他们想要的时候运行,所以几乎没有任何东西在你的控制之下 - 你永远不知道驱动器服务如何使用缓存,并且你不能强制驱动器服务到"做现在的工作,因为我需要它"。

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

答案 1 :(得分:4)

Google云端硬盘Android API无法立即与远程资源同步。根据调度程序,可能需要一段时间才能同步。调度依赖于Android的帐户同步组件,这些组件确保节省并有效地使用网络带宽和电池寿命。

此外,从Developer Preview开始,我们不支持删除或删除。但是,下一个版本可能会支持这些行动。

答案 2 :(得分:1)

虽然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);
      }
    }
  });
}

答案 3 :(得分:1)

如果您正在使用App Folder(对用户不可见),您的目标是删除该文件只是为了节省用户空间而不再重新选择它。所以,你可以使用&#34;空并忘记&#34;策略。

来自@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);
            }
        }

    });
}

答案 4 :(得分:1)

新版Google Play服务(7.0.0 / 2015年3月)最终以DriveRessource.trash()为特色。见https://developer.android.com/reference/com/google/android/gms/drive/DriveResource.html

Haven尚未对其进行测试 - 我很快就会报告。

// 修改 好吧,我测试了它确实有用......但不适用于app文件夹中的文件:Cannot trash App Folder or files inside the App Folder.显然你在使用app文件夹时无法使用此功能。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

自Google Play服务7.5起,支持删除和垃圾: https://developers.google.com/drive/release-notes#drive_android_api_google_play_services_75_-_may_28th_2015

我们建议将垃圾用于用户可见文件而不是删除,以便用户有机会恢复任何意外删除的内容。删除是永久性的,仅建议用于无法使用垃圾箱的应用程序文件夹内容。