适用于Android SDK的Google云端硬盘不会列出文件

时间:2013-12-28 21:41:06

标签: java android google-drive-api

我对Google Drive Android SDK有一个非常奇怪的问题。我已经使用它几个月了,直到上周它表现完美。然而,现在有一个非常奇怪的错误,它不会一直发生,但会发生10次中的9次。

我正在尝试列出存储在特定Google云端硬盘文件夹中的用户文件和文件夹。当我尝试使用方法Drive.files()。list()。execute()时,10次中有9次没有任何反应。该方法只是挂起,即使我离开它一小时,它仍然只是......没有。

我正在使用的代码如下 - 所有这些都在AsyncTask的doInBackground中运行。我已经检查了凭据 - 它们都很好,就像应用程序证书的SHA1哈希一样。没有异常被抛出。谷歌的搜索没有任何结果。以下是困扰我的特定代码:

    try {
       GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
                   SettingsActivity.this, Arrays.asList(DriveScopes.DRIVE));

       if (googleAccountName != null && googleAccountName.length() > 0) {
          credential.setSelectedAccountName(googleAccountName);

           Drive service = new Drive.Builder(AndroidHttp.newCompatibleTransport(),
                new GsonFactory(), credential).build();

           service.files().list().execute(); // Google Drive fails here
       } else {
          // ...
       }

    } catch (final UserRecoverableAuthIOException e) {

       // Authorisation Needed
       runOnUiThread(new Runnable() {
           @Override
           public void run() {
               try {
                   startActivityForResult(e.getIntent(), REQUEST_AUTHORISE_GDRIVE);
               } catch (Exception e) {
                   Log.e("SettingsActivity: Google Drive", "Unable to add Google Drive account due to Exception after trying to show the Google Drive authroise request intent, as the UserRecoverableIOException was originally thrown. Error message:\n" + e.getMessage());
               }
            }
       });

       Log.d("SettingsActivity: Google Drive", "UserRecoverableAuthIOException when trying to add Google Drive account. This is normal if this is the first time the user has tried to use Google Drive. Error message:\n" + e.getMessage());
       return;

    } catch (Exception e) {
       Log.e("SettingsActivity: Google Drive", "Unable to add Google Drive account. Error message:\n" + e.getMessage());
       return;
    }

我正在使用Drive API v2。谢谢大家!

修改

更多地玩了一下,事实证明这不仅仅是列出文件。尝试与Google云端硬盘上的任何文件进行互动的行为方式相同 - 删除,下载,创建......任何内容!我还注意到,将设备置​​于飞行模式以使其无法访问互联网也没有任何区别:Google Drive不会抛出异常,甚至返回,它只会冻结它所在的线程。

我已更新到最新的Drive API库,但这没有帮助。我记得在我将JSch SSH库添加到项目后很快就发生了错误,所以我删除了它,但它没有任何区别。删除和重新添加Drive API v2也没有任何区别,也没有清理项目。

编辑2

我发现了一些可能很重要的东西。在Google Developer控制台上,我记录了一些驱动器错误,如下所示:

TOP ERRORS:
Requests  % Requests  Methods              Error codes
18        38.30%      drive.files.list     400   
14        29.79%      drive.files.insert   500  
11        23.40%      drive.files.update   500  
4         8.51%       drive.files.get      400

你认为这些是错误吗?我怎么能解决它们?感谢

3 个答案:

答案 0 :(得分:0)

这是我的代码,它的工作

new AsyncTask<Void, Void, List<File>>() {

    @Override
    protected List<File> doInBackground(Void... params) {
        List<File> result = new ArrayList<File>();
        try {   
            com.google.api.services.drive.Drive.Files.List list = service.files().list();
            list.setQ("'" + sourcePath + "' in parents");
            FileList fileList = list.execute();
            result = fileList.getItems();
            if(result != null) {
                return result;
                }
           } catch (UserRecoverableAuthIOException e) {
            startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
           } catch (IOException e) {
                    e.printStackTrace();
           }
            return null;
           } 

    protected void onPostExecute(List<File> result) {
            //This is List file from Google Drive
    };
}.execute();

答案 1 :(得分:0)

我提出了一个可行的解决方案,并且认为我会发布它,以便其他人可以看到它,如果碰巧遇到问题。

幸运的是,我已经备份了以前所有版本的应用程序。所以我将整个项目恢复到两周前的状态,复制并粘贴了自那时以来制作的新版本的所有更改,并且它起作用了。我不明白为什么这应该有效,因为最终的结果是同一个项目,但确实如此!

答案 2 :(得分:0)

Google云端硬盘列表文件

这可能对您有帮助。尝试在ListView中显示它,您将看到所有已获取的文件夹

 public void if_db_updated(Drive service)
{
   try {

         Files.List request = service.files().list().setQ("mimeType = 'application/vnd.google-apps.folder'");

          FileList files = request.execute();

          for(File file : files.getItems())
           {        

                 String title = file.getTitle();                             
                showToast(title);


           }

       }  catch (UserRecoverableAuthIOException e) {
              startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
        } catch (IOException e) {
          e.printStackTrace();
        }


}

 public void showToast(final String toast) {
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show();
          }
        });