被删除的文件状态的新的谷歌云端硬盘Android API在不可靠报道(GDAA)被删除的文件状态的新

2019-05-12 06:10发布

这个问题一直缠着我,因为新的谷歌云端硬盘Android API(GDAA)的成立。 首先在这里讨论 ,我希望它会消失在以后的版本,但它仍然是存在的(如2014年3月19日的)。 用户丢弃(指“删除”行动“drive.google.com”)文件/文件夹不断出现在两个

  Drive.DriveApi.query(_gac, query), and  
  DriveFolder.queryChildren(_gac, query)

以及

  DriveFolder.listChildren(_gac)

方法,即使使用

  Filters.eq(SearchableField.TRASHED, false)

查询限定符,或者如果我使用的滤波的结果构建

for (Metadata md : result.getMetadataBuffer()) {
  if ((md == null) || (!md.isDataValid()) || md.isTrashed()) continue;
  dMDs.add(new DrvMD(md));
}

运用

  Drive.DriveApi.requestSync(_gac);

没有任何影响。 而时间以来经过去除变化很大,我的最后一个病例发生超过12小时。 它是完全随机的。

更糟的是,我甚至不能依靠清空回收站在“drive.google.com”,它不会产生任何结果可想而知。 有时文件状态更改为“isTrashed()”有时从结果列表中消失。

正如我一直在这个问题摆弄,我结束了以下superawfulhack:

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
}

即使没有这有助于。 该文件显示出来,即使该文件是在垃圾桶里的健康(和它的地位是双重过滤的查询和元数据的测试)。 它甚至可以愉快地写入并在垃圾桶检查时,它被修改。

这里的结论是,修复应该得到更高的优先级,因为它呈现多平台使用的驱动器不可靠的。 它将由开发商被发现在开发/调试过程中向右走,转向他们离开。

Answer 1:

在等待来自任何确认支持团队 ,我设计了一个hack允许了这个问题的解决方法。 使用相同的原理SO 22295903 ,逻辑涉及回落至REST风格的API。 基本上,滴GDAA的LIST /查询功能。

高电平的逻辑是:

  1. 查询的RESTful API检索有关文件(S)的ID / IDS
  2. 使用检索到的ID通过获得GDAA的驱动器Id“fetchDriveId()”

这里的代码片段来记录的过程:

1 /初始化都GDAA的“GoogleApiClient”和REST风格的“services.drive.Drive”

GoogleApiClient _gac;
com.google.api.services.drive.Drive _drvSvc;

void init(Context ctx, String email){
  // build GDAA  GoogleApiClient
  _gac = new GoogleApiClient.Builder(ctx).addApi(com.google.android.gms.drive.Drive.API)
    .addScope(com.google.android.gms.drive.Drive.SCOPE_FILE).setAccountName(email)
    .addConnectionCallbacks(ctx).addOnConnectionFailedListener(ctx).build();
  // build RESTFul (DriveSDKv2) service to fall back to  
  GoogleAccountCredential crd = GoogleAccountCredential
  .usingOAuth2(ctx, Arrays.asList(com.google.api.services.drive.DriveScopes.DRIVE_FILE));
  crd.setSelectedAccountName(email);
  _drvSvc = new com.google.api.services.drive.Drive.Builder(
                       AndroidHttp.newCompatibleTransport(), new GsonFactory(), crd).build();
}

由应用使用2 /方法,其查询驱动器的RESTful API,返回GDAA的驱动器Id。

String qry = "title = 'MYFILE' and mimeType = 'text/plain' and trashed = false";
DriveId findObject(String qry) throws Exception {
  DriveId dId = null;
  try {
    final FileList gLst = _drvSvc.files().list().setQ(query).setFields("items(id)").execute();
    if (gLst.getItems().size() == 1) {
      String sId = gLst.getItems().get(0).getId();
      dId = Drive.DriveApi.fetchDriveId(_gac, sId).await().getDriveId();
    } else if (gLst.getItems().size() > 1)
      throw new Exception("more then one folder/file found");
  } catch (Exception e) {}
  return dId;
}

上述(再次我使用为了简单起见,“等待()”的味道)的findObject()方法返回的驱动对象正确地,反射,没有明显的延迟(在非UI线程执行)的丢弃状态。

同样,我会强烈劝告反对代码离开这个长于necassary,因为它是与系统的其余部分无法预料的黑客攻击。



文章来源: Deleted files status unreliably reported in the new Google Drive Android API (GDAA)