如何正确使用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
相关产品推荐
相关产品推荐

