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

时间:2015-08-24 15:31:50

标签: android google-drive-android-api

我正在尝试从google驱动器访问所有文件和文件夹到arraya列表。但是我只能从Drive获得一个文件。怎么做从谷歌驱动器获取所有文件和文件夹。我使用以下代码..

由于 阿伦

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();

            }
        };

2 个答案:

答案 0 :(得分:1)

更新(2015年8月25日,美国运动会10:39)

根据您的评论,您有2个选项:

1 /留在GDAA,使用其中一个INTENTS
  - 选择具有开场活动的文件
  - 选择一个包含开场白活动的文件夹
请注意,GDAA不会让您的应用看到它没有创建的任何内容(仅限SCOPE_FILE),但它仍允许用户浏览所有内容。如果用户选择了一个文件,它将对您的应用程序可见。我不知道你的应用程序的意图,所以我不能说这种方法是否可用。

2 /使用 DRIVE 范围切换到REST,您的应用会看到所有内容(用户必须事先批准)。可以找到基本的CRUD实现here,但请确保将init()方法的范围更改为&#39; DriveScopes.DRIVE &#39;。

如果您的应用需要迭代文件夹树,在流程中收集文件,那么“testTree()&#39;和&#39; deleteTree()&#39; MainActivity()中的方法就是这样做的。

您也可以继续使用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)

但是您迟早会遇到由GDAA缓存/延迟引起的problems

原始回答

尝试这种方法:

  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

调用它
  

搜索(NULL,NULL,NULL)

列出Google云端硬盘中的所有文件。您将看到所有文件您的Android应用程序已创建 但只有那些 - 文件范围没有看到任何其他内容   如果您需要扫描目录树,您可能会仔细查看此GDAA demo,在MainActivity中,有&#39; testTree()&#39; /&#39; deleteTree()方法递归扫描目录树结构。

另外,您可以查看answer here,它会处理类似的问题(尤其是答案下的评论交换)。

祝你好运

答案 1 :(得分:0)

请注意,您可以使用GDAA检索您从Android设备上传或通过云端硬盘应用下载的文件和文件夹。这是为了获得更高的安全性(由谷歌引用)。

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

    int[] nums = {35, 21, 5, 6, 55, 7, 42, 165};
    boolean[] removed = new boolean[nums.length];

    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[i] > nums[j] && nums[i] % nums[j] == 0) {
                removed[j] = true;
            } else if (nums[i] < nums[j] && nums[j] % nums[i] == 0) {
                removed[i] = true;
            }
        }
    }

    for (int i = 0; i < nums.length; ++i) {
        if (!removed[i]) {
            System.out.print(nums[i] + " ");
        }
    }

    System.out.println();

请参阅完整代码here