如何用Authorization API替代GoogleSignInClient.silentSignIn实现Google Drive持久访问?
要实现和silentSignIn等效的「一次登录、长期静默使用Google Drive」功能,你可以通过Google Authorization API的已保存账户复用+自动令牌刷新机制来完成,核心逻辑是复用用户已授权过的账户,无需重复交互,且API会自动处理令牌过期刷新。
步骤1:添加依赖
在build.gradle(Module级别)中引入必要的依赖:
dependencies { // Google Authorization API implementation 'com.google.android.gms:play-services-auth:21.2.0' // Google Drive API客户端 implementation 'com.google.apis:google-api-services-drive:v3-rev20240822-2.0.0' // Google HTTP客户端 implementation 'com.google.http-client:google-http-client-android:1.44.1' implementation 'com.google.code.gson:gson:2.10.1' }
步骤2:初始化AuthorizationClient
创建全局的AuthorizationClient实例,用于处理授权逻辑:
import com.google.android.gms.auth.api.identity.AuthorizationClient; import com.google.android.gms.auth.api.identity.Identity; import com.google.android.gms.auth.api.identity.SignInOptions; // 初始化AuthorizationClient private AuthorizationClient getAuthorizationClient() { SignInOptions signInOptions = new SignInOptions.Builder(SignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(DriveScopes.DRIVE_APPDATA)) .requestEmail() .setClientId(GOOGLE_DRIVE_CLIENT_ID) // 替换为你的客户端ID .build(); return Identity.getAuthorizationClient(context, signInOptions); }
步骤3:实现静默获取授权(替代silentSignIn)
通过getSavedAccounts获取用户之前授权过的账户,再静默获取有效令牌:
import com.google.android.gms.auth.api.identity.GetAuthorizationTokenRequest; import com.google.android.gms.auth.api.identity.GetAuthorizationTokenResult; import com.google.android.gms.auth.api.identity.SavedAccount; import com.google.android.gms.tasks.Task; // 静默获取授权令牌,等效于silentSignIn private Task<GetAuthorizationTokenResult> silentGetAuthorizationToken() { AuthorizationClient client = getAuthorizationClient(); // 先获取已保存的授权账户 return client.getSavedAccounts() .continueWithTask(task -> { if (task.isSuccessful() && !task.getResult().isEmpty()) { // 使用第一个已保存的账户(多账户场景可自行处理) SavedAccount savedAccount = task.getResult().get(0); // 请求授权令牌,API会自动刷新过期令牌 GetAuthorizationTokenRequest request = new GetAuthorizationTokenRequest.Builder() .setSavedAccountId(savedAccount.getId()) .setScopes(List.of(DriveScopes.DRIVE_APPDATA)) .build(); return client.getAuthorizationToken(request); } // 没有已保存账户,返回失败任务,后续引导用户授权 return Tasks.forException(new Exception("No saved accounts found")); }); }
步骤4:构建Drive服务实例
用获取到的令牌创建Credential,再初始化Drive服务:
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; import com.google.api.services.drive.Drive; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; // 从授权结果构建Drive服务 private Drive buildDriveService(GetAuthorizationTokenResult result) { GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2( context, List.of(DriveScopes.DRIVE_APPDATA) ); // 设置令牌和账户信息 credential.setToken(result.getAuthorizationToken()); credential.setSelectedAccountName(result.getAccountName()); return new Drive.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance(), credential ) .setApplicationName(APPLICATION_NAME) // 替换为你的应用名称 .build(); }
步骤5:处理首次授权(无已保存账户时)
如果静默获取失败,引导用户完成首次授权,并保存账户:
import com.google.android.gms.auth.api.identity.BeginAuthorizationRequest; import com.google.android.gms.auth.api.identity.BeginAuthorizationResult; // 发起首次授权流程 private void startFirstTimeAuthorization() { AuthorizationClient client = getAuthorizationClient(); BeginAuthorizationRequest request = new BeginAuthorizationRequest.Builder() .setScopes(List.of(DriveScopes.DRIVE_APPDATA)) .setClientId(GOOGLE_DRIVE_CLIENT_ID) .build(); client.beginAuthorization(request) .addOnSuccessListener(result -> { // 启动授权UI result.getPendingIntent().send(context, 0, null, null, null); }) .addOnFailureListener(e -> { // 处理授权失败 }); } // 在Activity中接收授权结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == AUTHORIZATION_REQUEST_CODE) { AuthorizationClient client = getAuthorizationClient(); client.getAuthorizationTokenFromIntent(data) .addOnSuccessListener(result -> { // 授权成功,构建Drive服务并使用 Drive drive = buildDriveService(result); // 后续操作... }) .addOnFailureListener(e -> { // 处理授权失败 }); } }
关键说明
- 静默授权逻辑:
getSavedAccounts会返回用户之前授权过的账户,无需再次弹出登录框;getAuthorizationToken会自动检查令牌有效期,过期时自动刷新,无需手动处理。 - 长期有效性:只要用户未在Google账户设置中取消对应用的授权,已保存的账户会一直有效,实现「一次登录、长期使用」的效果,和
silentSignIn完全等效。 - 多账户处理:如果支持多账户,可以遍历
getSavedAccounts的结果,让用户选择要使用的账户,再发起令牌请求。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

