未在 Android 应用中完整列出 Google 云端硬盘文件夹和文件

Not fully listing Google Drive folders and files in Android app

我正在尝试将所有文​​件和文件夹从 google 驱动器访问到 arraya 列表。但是我只能从云端硬盘中获取一个文件。该怎么做 从 google 驱动器获取所有文件和文件夹。我正在使用以下代码..

谢谢 阿伦

public void onConnected(Bundle connectionHint) {
    // Log.i(TAG, "API client connected.");
    Toast.makeText(getActivity(), "Successfully logged in", Toast.LENGTH_LONG).show();
    DriveFolder s = Drive.DriveApi.getRootFolder(mGoogleApiClient);

    String s1 = (Drive.DriveApi.getRootFolder(mGoogleApiClient)).getDriveId().toString();
    DriveId sFolderId2 = DriveId.decodeFromString(s1);
    DriveId sFolderId = (Drive.DriveApi.getRootFolder(mGoogleApiClient)).getDriveId();

    DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, sFolderId);
    folder.listChildren(mGoogleApiClient).setResultCallback(rootFolderCallback);
    //  findAll(folder);

}

public ResultCallback<DriveApi.MetadataBufferResult> rootFolderCallback = new
        ResultCallback<DriveApi.MetadataBufferResult>() {
            @Override
            public void onResult(DriveApi.MetadataBufferResult result) {
                if (!result.getStatus().isSuccess()) {

                    return;
                }
                 resultarray = new ArrayList<String>();
                int hh = result.getMetadataBuffer().getCount();

                for (int i = 0; i < result.getMetadataBuffer().getCount(); i++) {
                    resultarray.add(result.getMetadataBuffer().get(i).getTitle());
                }

                Toast.makeText(getActivity(), "Successfully listed files.", Toast.LENGTH_LONG).show();

            }
        };

更新(2015 年 8 月 25 日,10:39 MST)

根据您在下方的评论,您有 2 个选择:

1/ 留在 GDAA, use one of the INTENTS:
- 选择一个带有 opener 的文件 activity
- 选择一个带 opener 的文件夹 activity
看,GDAA 不会让您的应用看到任何不是它创建的内容(仅限 SCOPE_FILE),但它仍然允许用户浏览所有内容。如果用户选择一个文件,它将对您的应用程序可见。我不知道你的应用程序的意图,所以我不能说这种方法是否可用。

2/ 切换到 REST with the DRIVE scope and your app will see everything (user has to approve up front). The basic CRUD implementation can be found here 但确保将 init() 方法中的范围更改为“DriveScopes.DRIVE”。

如果您的应用需要循环访问文件夹树,并在此过程中收集文件,MainActivity() 中的 'testTree()' 和 'deleteTree()' 方法都可以做到这一点。

您也可以继续使用 GDAA 并通过添加

向其添加 REST 功能
com.google.api.services.drive.Drive mGOOSvc = new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(),
        GoogleAccountCredential.usingOAuth2(appContext, Collections.singletonList(DriveScopes.DRIVE))
        .setSelectedAccountName(email)

但你迟早会 运行 进入 problems 由 GDAA 缓存/延迟引起的。

原始答案

试试这个方法:

  private static GoogleApiClient mGAC;
  /****************************************************************************
   * find file/folder in GOODrive
   * @param prnId   parent ID (optional), null searches full drive, "root" searches Drive root
   * @param titl    file/folder name (optional)
   * @param mime    file/folder mime type (optional)
   * @return        arraylist of found objects
   */
  static void search(String prnId, String titl, String mime) {
    if (mGAC != null && mGAC.isConnected()) {
      // add query conditions, build query
      ArrayList<Filter> fltrs = new ArrayList<>();
      if (prnId != null){
        fltrs.add(Filters.in(SearchableField.PARENTS,
        prnId.equalsIgnoreCase("root") ?
          Drive.DriveApi.getRootFolder(mGAC).getDriveId() : DriveId.decodeFromString(prnId)));
      }
      if (titl != null) fltrs.add(Filters.eq(SearchableField.TITLE, titl));
      if (mime != null) fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
      Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build();

      // fire the query
      Drive.DriveApi.query(mGAC, qry).setResultCallback(new ResultCallback<MetadataBufferResult>() {
        @Override
        public void onResult(MetadataBufferResult rslt) {
          if (rslt != null && rslt.getStatus().isSuccess()) {
            MetadataBuffer mdb = null;
            try {
              mdb = rslt.getMetadataBuffer();
              if (mdb != null ) for (Metadata md : mdb) {
                if (md == null || !md.isDataValid()) continue;
                String title = md.getTitle();
                DriveId driveId = md.getDriveId();
                //.......
              }
            } finally { if (mdb != null) mdb.close(); }
          }
        }
      });
    }
  }

先用 NULL 调用它

search(null,null,null)

列出 Google 驱动器中的所有文件。您将看到 您的 Android 应用创建的所有文件但只有那些 - FILE 范围看不到任何其他内容.
如果需要扫描目录树,可以仔细看这个GDAA demo,在MainActivity中,有'testTree()'/'deleteTree()方法递归扫描目录树结构

另外,你可以看看,它处理了类似的问题(特别是答案下的评论交流)。

祝你好运

请注意,您可以使用 GDAA 检索从 Android 设备上传或通过驱动器应用程序下载的文件和文件夹。这是为了有更多的安全性(引用Google)。

在他的代码中,您需要确保您正在为您的 Google 云端硬盘帐户中可能存在的文件尝试所有可能的组合。例如,检查您是否正在跟踪文件或文件夹的父级。如果不满足此条件,您的应用将无法检索这些特定文件。

/** Get the list of parents Id in ascending order. */
   private List<String> collectParents(String folderId, Map<String, String> folderIdToParentId){
      String parentId = folderIdToParentId.get(folderId);
      if (logger.isTraceEnabled()){
         logger.trace("Direct parent of {} is {}", folderId, parentId);
      }
      List<String> ancestors = new ArrayList<String>();
      ancestors.add(parentId);

      if (folderIdToParentId.containsKey(parentId)){
         ancestors.addAll(collectParents(parentId, folderIdToParentId));
         return ancestors;
      }
      return ancestors;
   }

查看完整代码here