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

如何用Authorization API替代GoogleSignInClient.silentSignIn实现Google Drive持久访问?

替代GoogleSignInClient.silentSignIn的Authorization API实现方案

要实现和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:54:51