【问题标题】:Fetch File List from google drive Android从 google drive Android 获取文件列表
【发布时间】:2015-06-09 14:08:04
【问题描述】:

我正在尝试使用播放服务中提供的驱动器 sdk 从谷歌驱动器获取文件列表。

我正在使用 google 自己在 Android Demo 中提供的以下查询。

Query query = new Query.Builder()
                .build();
        Drive.DriveApi.query(mGoogleApiClient, query)
               .setResultCallback(metadataCallback);

/**
     * Gives the result back in MetadataBufferReuslt format
     */
    final private ResultCallback<DriveApi.MetadataBufferResult> metadataCallback =
            new ResultCallback<DriveApi.MetadataBufferResult>() {
                @Override
                public void onResult(DriveApi.MetadataBufferResult result) {
                    ArrayList<GoogleDriveResultModel> googleDriveResultArr=new ArrayList<>();
                    if (!result.getStatus().isSuccess()) {
                        showSnackBar("Problem while retrieving results");
                        return;
                    }
                    googleDriveResultArr.clear();

                    showSnackBar("Found " + result.getMetadataBuffer().getCount() + " files");

                    for(Metadata metadata: result.getMetadataBuffer()){
                            GoogleDriveResultModel model = new GoogleDriveResultModel();
                            model.setTitle(metadata.getTitle());
                            model.setGoogleDriveId(metadata.getDriveId().getResourceId());
                            model.setLink(metadata.getWebContentLink());
                            googleDriveResultArr.add(model);
                        Config.debug("Google File " + metadata.getDriveId().getResourceId() + " : " + metadata.getTitle() +
                                " : " + metadata.getWebContentLink()+" is Trashed "+metadata.isTrashed());
                    }


                }
            };

这里的问题是我没有得到我添加或删除的文件。它显示相同的文件。我认为它没有与服务器同步。我试图通过 Google Drive 应用程序查看这些文件,一切似乎都很好。它只是我的应用程序没有获取更新的文件(即添加/删除的文件)任何猜测?

【问题讨论】:

  • 只是为了确保,新文件是否由同一个 Android 应用程序创建/删除?在 FILE 范围内,其他应用程序创建的任何对象(例如“drive.google.com”)对您“query()”都是不可见的。
  • @seanpj 不,我正在驱动器中添加/删除网络上的文件并尝试查看应用程序中的差异。
  • 所以,您的代码(以及下面的代码)可能是正确的。这是导致您的问题的 FILE 范围,不幸的是 GDAA 只有这个范围。您有 2 个选择:使用 GDAA 的文件选择器,或切换到具有 DRIVE 范围的 REST Api。
  • @seanpj 你能给出一些像 tuts 这样的指针吗?我尝试使用 rest api googleapis.com/drive/v2/files?key={API_KEY} 我收到 401 错误。
  • 从基本的 CRUD 功能开始(GDAAREST)。我无法为您决定使用哪一个,因为我不知道您的目标是什么。

标签: android google-drive-api google-drive-android-api


【解决方案1】:

更新
根据我们上面的评论交流,下面的解决方案可能没有帮助。该问题很可能在 GDAA 支持的可见性范围内。请参阅“Connecting and Authorizing the Google Drive Android API”段落。

原始答案
如果我没有看到查询本身,就很难弄清楚您的查询失败的原因。
所以,既然我不能帮助你,我可能会提供一个代码 sn-p 你可以尝试插入,只是为了看看你是否幸运。您可以修改过滤器构建部分以满足您的需要,它必须位于非 UI 线程包装器中,例如 AyncTask、Thread、...
父 ID 作为 DriveId 的字符串表达式提供。 mGAC 当然是 mGoogleApiClient。

  /****************************************************************************
   * 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)
   */
  static void search(String prnId, String titl, String mime) {

    if (mGAC != null && mGAC.isConnected()) try {

      // 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
      MetadataBufferResult rslt = Drive.DriveApi.query(mGAC, qry).await();
      if (rslt.getStatus().isSuccess()) {
        MetadataBuffer mdb = null;
        try {
          mdb = rslt.getMetadataBuffer();
          for (Metadata md : mdb) {
            if (md == null || !md.isDataValid() || md.isTrashed()) continue;
            //   md.getTitle(), md.getDriveId(), ....
          }
        } finally { if (mdb != null) mdb.close(); }
      }
    } catch (Exception e) {}
  }

到目前为止,它对我有用,祝你好运

【讨论】:

    【解决方案2】:
    1. 私有静态驱动服务;

    复制这个方法并调用它:

    private void saveFileToDevice() {

        try {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
    
                    FileList temp = null;
                    try {
                        temp = service
                                .files()
                                .list()
                                .execute();
                    } catch (UserRecoverableAuthIOException e) {
                        startActivityForResult(e.getIntent(),
                                REQUEST_AUTHORIZATION);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (temp != null) {
                        if (temp.getItems().size() <= 0) {
                            showToast("No File Available for Download.");
                            DeleteAlbumTask del = new DeleteAlbumTask();
                            del.execute(0);
                            return;
                        }
                        final FileList finalTemp = temp;
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                showFileSelectList(finalTemp);
                            }
                        });
    
                    } else {
                        showToast("No File Available for Download.");
                        DeleteAlbumTask del = new DeleteAlbumTask();
                        del.execute(0);
                        return;
                    }
                }
            });
            t.start();
    
        } catch (Exception ex) {
            showToast(ex.getMessage());
        }
    }
    

    【讨论】:

    • 这段代码是否使用了 google play services sdk?是否用于从驱动器 sdk 中获取所有文件。不是特定的文件?
    • 可以混合使用RESTGDAA,但您会遇到必须处理的时间/延迟问题。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多