尝试在appDataFolder中获取文件列表时出现GoogleAuthIOException

时间:2018-10-22 09:27:24

标签: java android google-drive-api

我正在尝试将应用程序数据库保存到Google云端硬盘上的Apps文件夹中。我正在使用Drive v3 API。 几个月前,一切正常,数据成功保存到用户appData文件夹中。但是目前,我正在获取GoogleAuthIOException。 我的应用程序在Google控制台中具有所有必需的API密钥(oAuth,云端硬盘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

如何从错误中看到-身份验证问题。但是我所有的代码都来自Java的Google示例。如何解决此错误?

从理论上讲,我需要执行一些授权程序,但我的情况下找不到一个授权程序

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了解决方法。

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

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;
}