更新(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应用程序查询将无法找到它们。它表现得像我期望的那样:
使用新的GDAA,它似乎不起作用。这让我想到了第二点:
DELETE / TRASH功能。
我试图测试CRUD功能,根本找不到DELETE(再次,这可能是我的无知/短视)。从" drive.google.com"中删除它们让它们在那里看不见,但Android应用程序仍然可以看到它们。元数据可以通过" isTrashed()"查询,但是" MetadataChangeSet.Builder"这将让我删除/删除它们,只有setMimeType(),setStarred(),setTitle()。
我迷路了,请帮帮忙。
答案 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
我们建议将垃圾用于用户可见文件而不是删除,以便用户有机会恢复任何意外删除的内容。删除是永久性的,仅建议用于无法使用垃圾箱的应用程序文件夹内容。