自从新的 Google Drive Android Api (GDAA) 推出以来,这个问题一直困扰着我。首先在这里讨论,我希望它会在以后的版本中消失,但它仍然存在(截至 2014/03/19)。用户删除的(指“drive.google.com”中的“删除”操作)文件/文件夹不断出现在
Drive.DriveApi.query(_gac, query), and
DriveFolder.queryChildren(_gac, query)
Run Code Online (Sandbox Code Playgroud)
也
DriveFolder.listChildren(_gac)
Run Code Online (Sandbox Code Playgroud)
方法,即使与
Filters.eq(SearchableField.TRASHED, false)
Run Code Online (Sandbox Code Playgroud)
查询限定符,或者如果我对结果使用过滤构造
for (Metadata md : result.getMetadataBuffer()) {
if ((md == null) || (!md.isDataValid()) || md.isTrashed()) continue;
dMDs.add(new DrvMD(md));
}
Run Code Online (Sandbox Code Playgroud)
使用
Drive.DriveApi.requestSync(_gac);
Run Code Online (Sandbox Code Playgroud)
没有影响。自移除以来经过的时间变化很大,我的最后一个案例超过 12 小时。它是完全随机的。
更糟糕的是,我什至不能依赖“drive.google.com”中的 EMPTY TRASH,它不会产生任何可预测的结果。有时文件状态更改为“isTrashed()”,有时它会从结果列表中消失。
当我不断摆弄这个问题时,我最终得到了以下超级骇客:
find file with TRASH status equal FALSE
if (file found and is not trashed) {
try to write content
if ( write content fails)
create a new file
}
Run Code Online (Sandbox Code Playgroud)
甚至这也无济于事。即使文件在垃圾箱中,该文件也显示为健康(并且它的状态被查询和元数据测试双重过滤)。它甚至可以愉快地写入并在垃圾箱中检查时进行修改。
这里的结论是修复应该获得更高的优先级,因为它使 Drive …
我已经遇到过这个问题几次了,但我永远都不会指责它,把它归咎于GDAA的延迟,我的错误代码等......我终于想出了一个我可以安全地重现它的场景,所以我想问一下那些知道这是我不理解的功能还是一个普通错误的人.如果是后者,请指出我可以唠叨的地方.
为简单起见,我将在REST API的背景上讨论它.
1 /让我们拥有一个在DRIVE_FILE范围内运行的Drive API认证应用
com.google.api.services.drive.Drive svc =
new Drive.Builder(
AndroidHttp.newCompatibleTransport(),
new GsonFactory(),
GoogleAccountCredential
.usingOAuth2( context, Collections.singletonList(DriveScopes.DRIVE_FILE))
).build();
Run Code Online (Sandbox Code Playgroud)
2 /使用在Google驱动器中创建文件(文件/文件夹)
svc.files().insert([METADATA], [CONTENT]).execute();
Run Code Online (Sandbox Code Playgroud)
3 /搜索您使用的对象
svc.files().list().setQ([QUERY]).setFields([FIELDS]).execute();
Run Code Online (Sandbox Code Playgroud)
当应用程序运行时,用户将执行通常的Account-Pick/Drive-Authorize例程,一切都按预期工作.创建文件,可见,可以找到......直到用户通过以下方式撤销授权
设置>管理应用>断开驱动器
在drive.google.com中.
之后,如果Android应用程序重新启动(并重新授权),则撤消之前创建的任何对象都不可见.
可能是设计,我不知道.如果是这种情况,我无法找到Android应用程序如何获取之前创建的任何内容.我当然可以使用DRIVE范围创建另一个"维护"应用来解决这个问题,但......
现在,就GDAA而言,它变得更糟.不仅GDAA没有DRIVE范围来修复它,而且如果完成相同的步骤序列并且应用程序在撤销后立即创建文件/文件夹,GDAA不会抱怨,但根本不会创建文件/文件夹.过了一会儿(分钟),重新授权弹出,但是,同时创建的文件无处可寻,撤销之前的所有内容都会丢失给(创建者)应用程序(它当然可见显然具有DRIVE范围的Web应用程序).
谢谢你的耐心等待.
我想从我的应用程序上传一个db文件到谷歌驱动器.我能够在谷歌驱动器中创建一个文件夹,但我没有得到如何上传数据库文件.
这是我的代码.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.drive.Drive;
import com.google.android.gms.drive.DriveApi;
import com.google.android.gms.drive.DriveContents;
import com.google.android.gms.drive.DriveFile;
import com.google.android.gms.drive.DriveFolder;
import com.google.android.gms.drive.DriveFolder.DriveFolderResult;
import com.google.android.gms.drive.DriveId;
import com.google.android.gms.drive.Metadata;
import com.google.android.gms.drive.MetadataChangeSet;
import com.google.android.gms.drive.DriveApi.DriveContentsResult;
import com.google.api.client.http.FileContent;
//import com.google.api.services.drive.Drive;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
//import com.google.api.services.drive.Drive;
public class MainActivity extends BaseDemoActivity {
private final static String TAG = "MainActivity";
DriveId …Run Code Online (Sandbox Code Playgroud) 我已更新到新版Google Play Services 4.2(库版本15).突然之间,对DriveId.createFromResourceId("....")的调用尚未解决.
DriveId sFolderId = DriveId.createFromResourceId("0B2EE......N3J6RU0");
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用DriveId或encodeToString()/ decodeFromString()代替,但是:
无论是文档和演示代码使用方法广泛.此外,镜像方法getResourceId()仍然存在.
这不仅仅是一个问题,而是要求Google云端硬盘/Google Play Svcs人员澄清.