java - 尝试获取 appDataFolder 中的文件列表时出现 GoogleAuthIOException

标签 java android google-drive-api

我正在尝试将应用数据库保存到 Google 云端硬盘上的 Apps 文件夹。我正在使用云端硬盘 v3 API。 几个月前,一切正常,数据成功保存到用户 appData 文件夹。但现在,我收到了 GoogleAuthIOException。 我的应用在 Google Console 中拥有所有必需的 API key (oAuth、Drive API)

这是我的代码:

首先,向用户显示一个对话框,以获取他的帐户:

mCredential = GoogleAccountCredential.usingOAuth2(
        getApplicationContext(), Collections.singletonList(DriveScopes.DRIVE_APPDATA))
        .setBackOff(new ExponentialBackOff());
//...
startActivityForResult(
                    mCredential.newChooseAccountIntent(),
                    REQUEST_ACCOUNT_PICKER);
//...
if (resultCode == RESULT_OK && data != null &&
                    data.getExtras() != null) {
                String accountName =
                        data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                if (accountName != null) {
                    mCredential.setSelectedAccountName(accountName);
 }
}

接下来,我执行 AsyncTask,检查文件夹中的当前文件(如果需要,将其删除)并将当前数据库保存在其中。

我的 AsyncTask 类的完整列表:

private class MakeRequestTask extends AsyncTask<Boolean, Void, Boolean> {
    private com.google.api.services.drive.Drive mService;
    File databasePath;
    FileList fileList;

    MakeRequestTask(GoogleAccountCredential credential) {
        HttpTransport transport = AndroidHttp.newCompatibleTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        mService = new com.google.api.services.drive.Drive.Builder(
                transport, jsonFactory, credential)
                .setApplicationName(getString(R.string.app_name))
                .build();
        databasePath = BackupActivity.this.getDatabasePath(databaseName);
    }


    @Override
    protected Boolean doInBackground(Boolean... params) {
        if (params[0]) {
            com.google.api.services.drive.model.File fileMetadata = new com.google.api.services.drive.model.File();
            fileMetadata.setName(databaseOnGDName);
            fileMetadata.setParents(Collections.singletonList("appDataFolder"));
            FileContent mediaContent = new FileContent("application/x-sqlite3", databasePath);
            try {
                fileList = mService.files().list().setSpaces("appDataFolder").execute(); //Here error appears
                if (fileList.getFiles().size() == 0) {
                    mService.files().create(fileMetadata, mediaContent).execute();
                } else {
                    for (com.google.api.services.drive.model.File file : fileList.getFiles()) {
                        mService.files().delete(file.getId()).execute();
                    }
                    mService.files().create(fileMetadata, mediaContent).execute();
                }
                return null;
            } catch (Exception e) {
                e.printStackTrace();
                return true;
            }
        } else {
            try {
                fileList = mService.files().list().setSpaces("appDataFolder").execute();
                for (com.google.api.services.drive.model.File file : fileList.getFiles()) {
                    if (file.getName().equals(databaseOnGDName)) {
                        File appDB = databasePath;
                        InputStream inputStream = mService.files().get(file.getId()).executeMediaAsInputStream();
                        OutputStream outputStream = new FileOutputStream(appDB);
                        IOUtils.copy(inputStream, outputStream);
                        inputStream.close();
                        outputStream.close();
                    }
                }
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return true;
            }
        }
    }
}

来自 logcat 的错误:

2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:299)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:868)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at evansir.tarotdivinations.BackupActivity$MakeRequestTask.doInBackground(BackupActivity.java:291)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at evansir.tarotdivinations.BackupActivity$MakeRequestTask.doInBackground(BackupActivity.java:266)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:333)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at java.lang.Thread.run(Thread.java:764)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err: Caused by: com.google.android.gms.auth.GoogleAuthException: Unknown
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.zze.zza(Unknown Source:133)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.zzd.zza(Unknown Source:21)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.zzd.zza(Unknown Source:74)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.zzd.getToken(Unknown Source:3)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.zzd.getToken(Unknown Source:5)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.zzd.getToken(Unknown Source:7)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source:0)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:267)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:     at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:292)
2018-10-22 12:34:45.426 8931-9036/evansir.tarotdivinations W/System.err:    ... 12 more

我如何从错误中看出身份验证中的问题。但我所有的代码都来自 Google 示例 Java 。我该如何解决这个错误?

理论上,我需要执行一些授权程序,但我没有找到适合我的情况

最佳答案

好吧,我终于找到了解决办法。

首先,当用户在此处选择他的帐户时:

startActivityForResult(
                mCredential.newChooseAccountIntent(),
                REQUEST_ACCOUNT_PICKER);

我使用 setSelectedAccount(account, "package") 设置所选帐户,而不是 setSelectedAccountName(accountName)

我在 AsyncTask 中添加了一个捕获,它创建一个请求许可的对话框(如 official documentation 中所述):

        try {

            fileList = mService.files().list().setSpaces("appDataFolder").execute();
            //...
            return null;
        } catch (UserRecoverableAuthIOException e) {
            e.printStackTrace();
            errorCode = 1;
            startActivityForResult(e.getIntent(), REQUEST_SIGNIN_REQUIRED);
            return true;
}

关于java - 尝试获取 appDataFolder 中的文件列表时出现 GoogleAuthIOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52926124/

相关文章:

java - 如何使用curl使用2个参数进行POST?休息。 java

java - Volley deliverResponse 未被调用

java - 如何在没有Java中的java.net.BindException的情况下监听本地主机中的两个端口?

android - 我不知道为什么我会遇到越界异常?

android - Eclipse 在 android xml 文件中插入一个新行

java - 使用 Drive v2 Java API 将 CSV 上传到 Google Drive 电子表格

java - 有没有模板可以为spring jdbc模板生成java代码片段

android - 清除 FLAG_NOT_TOUCHABLE 后接收过去的事件

google-drive-api - Google Drive 示例中未调用 handleClientLoad 函数

iphone - 谷歌驱动器直接链接到文件