You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用Google Drive REST API?Android端创建文件夹遇认证异常求助

解决Google Drive REST API调用时的UserRecoverableAuthIOException问题

我来帮你梳理这个问题——UserRecoverableAuthIOException本质上是Google API在告诉你:当前的授权状态不足以完成这个操作,需要引导用户完成额外的授权步骤(比如确认权限、重新登录等)。哪怕你已经完成了初始的Google Sign-In,第一次调用Drive API时也很容易遇到这个情况。下面是具体的解决步骤:

1. 捕获并处理UserRecoverableAuthIOException的恢复流程

首先你需要在调用API的代码中捕获这个异常,然后提取其中的恢复Intent,让用户完成授权操作。

步骤1:定义自定义异常传递恢复Intent

public class RecoverableAuthException extends Exception {
    private final Intent mRecoveryIntent;

    public RecoverableAuthException(Intent recoveryIntent) {
        mRecoveryIntent = recoveryIntent;
    }

    public Intent getRecoveryIntent() {
        return mRecoveryIntent;
    }
}

步骤2:修改createFolder方法,捕获异常并抛出自定义异常

public Task<GoogleDriveFileHolder> createFolder(final String folderName, @Nullable final String folderId) {
    return Tasks.call(mExecutor, new Callable<GoogleDriveFileHolder>() {
        @Override
        public GoogleDriveFileHolder call() throws Exception {
            GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();
            List<String> root = folderId == null 
                ? Collections.singletonList("root") 
                : Collections.singletonList(folderId);

            File metadata = new File()
                .setParents(root)
                .setMimeType(DriveFolder.MIME_TYPE)
                .setName(folderName);

            try {
                File googleFile = mDriveService.files().create(metadata).execute();
                googleDriveFileHolder.setId(googleFile.getId());
                return googleDriveFileHolder;
            } catch (UserRecoverableAuthIOException e) {
                // 把恢复Intent通过自定义异常传递出去
                throw new RecoverableAuthException(e.getIntent());
            }
        }
    });
}

步骤3:在调用createFolder处处理恢复逻辑

mDriveServiceHelper.createFolder("MyAppFolder", null)
    .addOnSuccessListener(googleDriveFileHolder -> {
        // 文件夹创建成功,处理后续逻辑
        Log.d("Drive", "Folder created with ID: " + googleDriveFileHolder.getId());
    })
    .addOnFailureListener(e -> {
        if (e instanceof RecoverableAuthException) {
            // 启动恢复Intent,让用户完成授权
            startActivityForResult(
                ((RecoverableAuthException) e).getRecoveryIntent(),
                REQUEST_CODE_AUTH_RECOVERY // 自定义请求码,比如1002
            );
        } else {
            // 处理其他类型的错误
            Log.e("Drive", "Error creating folder", e);
        }
    });

步骤4:处理授权恢复的结果

在Activity的onActivityResult中处理授权结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_AUTH_RECOVERY) {
        if (resultCode == RESULT_OK) {
            // 用户完成授权,重新尝试创建文件夹
            mDriveServiceHelper.createFolder("MyAppFolder", null)
                .addOnSuccessListener(holder -> Log.d("Drive", "Retry successful: " + holder.getId()));
        } else {
            // 用户拒绝授权,提示错误
            Toast.makeText(this, "授权失败,无法创建文件夹", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 验证DriveService的创建是否正确

确保你的getGoogleDriveService方法正确初始化了带有有效凭证的Drive实例,这里是标准实现:

private Drive getGoogleDriveService(Context context, GoogleSignInAccount account, String appName) {
    GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
        context,
        Collections.singletonList(DriveScopes.DRIVE) // 确保权限范围和Sign-In时一致
    );
    credential.setSelectedAccount(account.getAccount());

    return new Drive.Builder(
        AndroidHttp.newCompatibleTransport(),
        new GsonFactory(),
        credential)
        .setApplicationName(appName)
        .build();
}

3. 检查开发者控制台配置

  • 确认OAuth 2.0客户端ID的签名证书指纹和当前应用的签名一致(debug和release环境要分别配置)。
  • 如果是测试应用,确保在OAuth同意屏幕中添加了测试用户,否则非测试用户无法完成授权。
  • 确认Drive API已经在开发者控制台中启用。

4. 确认权限范围的合理性

你当前用的是DriveScopes.DRIVE(全权限),如果只需要创建文件夹和上传文件,也可以用更精细的权限比如DriveScopes.DRIVE_FILE(仅访问应用创建的文件),不过全权限本身没问题,只要用户同意授权即可。

按照上面的步骤处理后,应该就能解决UserRecoverableAuthIOException的问题了——核心是不要忽略这个异常,而是引导用户完成必要的授权恢复操作。

内容的提问来源于stack exchange,提问作者Shantanu Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:54:08