最近,我有Android代码访问Google云端硬盘.我正在使用Google API Client Library for Java而不是Google Play服务客户端库
private static GoogleCloudFile searchFromGoogleDrive(Drive drive, String qString, HandleUserRecoverableAuthIOExceptionable h, PublishProgressable p) {
try {
Files.List request = drive.files().list().setQ(qString);
do {
if (p.isCancelled()) {
return null;
}
FileList fileList = request.execute();
Run Code Online (Sandbox Code Playgroud)
如果我使用,代码可以在几年内完成100%罚款targetSdkVersion 21.
最近,我将我的应用迁移到targetSdkVersion 23了Google Drive相关代码的0更改.
但是,代码崩溃了FileList fileList = request.execute();,但有以下异常.
Process: org.yccheok.jstock.gui, PID: 30317
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at …Run Code Online (Sandbox Code Playgroud) 我正在滥用这个论坛来征求GDAA通知功能的预期用途的解释(来自GDAA支持团队).这里的文档足以实现它,并且两个相关的SO问题22980497和22778501涉及相同的主题.但我无法理解它的用途.这是一个例子.
那么,有什么好处呢?某个特定设备上的应用程序知道它只是修改了一个对象,不需要通知.另一方面,如果它通知另一个设备修改了具有CONSIDERABLE(分钟)延迟的对象,那么如何实现同步呢?或者如何使用呢?我被建议使用'requestSync()',但没有看到任何差异(此外,它与直接轮询有何不同).
今天,我可以通过轮询可靠地同步多个设备,但无法使其与未按时通知的通知一起使用.
我已经遇到过这个问题几次了,但我永远都不会指责它,把它归咎于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应用程序).
谢谢你的耐心等待.