我对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也没有任何区别,也没有清理项目。
我发现了一些可能很重要的东西。在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
你认为这些是错误吗?我怎么能解决它们?感谢
答案 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();
}
});