6

更新(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 应用程序不再看到它们。

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

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

我迷路了,请帮忙。

4

7 回答 7

5

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

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

于 2014-10-23T08:28:57.480 回答
4

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

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

于 2014-01-27T15:15:40.157 回答
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);
      }
    }
  });
}
于 2014-04-05T11:53:11.993 回答
1

新版 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 文件夹时使用此功能。

于 2015-03-24T17:43:52.387 回答
1

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

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

    });
}
于 2015-01-24T08:39:10.043 回答
0

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

于 2014-01-31T12:36:07.513 回答
0

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

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

于 2015-05-29T06:33:20.323 回答