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

Android Kotlin应用启动自动连接指定账号Google Drive的后续步骤

后续实现步骤

1. 引入Google Drive相关依赖

在app模块的build.gradle.kts中添加以下依赖:

dependencies {
    // Google 账号认证依赖
    implementation("com.google.android.gms:play-services-auth:20.7.0")
    // Google Drive Android API 依赖
    implementation("com.google.android.gms:play-services-drive:17.0.0")
}

2. 配置AndroidManifest.xml

添加必要的权限和元数据:

  • 网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  • 配置API密钥和Drive应用ID(从Google Cloud Console凭据页面获取):
<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="你的API_KEY"/>
<meta-data
    android:name="com.google.android.gms.drive.APP_ID"
    android:value="你的应用数字ID"/>
  • 声明Drive服务组件:
<service
    android:name="com.google.android.gms.drive.DriveApiService"
    android:exported="true"
    android:permission="com.google.android.gms.permission.DRIVE_SERVICE"/>

3. 实现账号自动登录验证逻辑

应用启动时(比如Application的onCreate或主Activity的onCreate),先检查设备上的已登录账号是否匹配配置项指定的账号:

初始化GoogleSignInClient

// 配置登录选项,指定Drive权限范围(根据需求选SCOPE_FILE或SCOPE_FULL_ACCESS)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestScopes(Drive.SCOPE_FILE)
    .requestEmail()
    .build()

val googleSignInClient = GoogleSignIn.getClient(context, gso)

检查并匹配账号

val targetAccountEmail = "配置项中的目标账号邮箱"

// 获取上次登录的账号
val lastSignedInAccount = GoogleSignIn.getLastSignedInAccount(context)
when {
    lastSignedInAccount != null && lastSignedInAccount.email == targetAccountEmail -> {
        // 账号匹配,直接初始化Drive连接
        initDriveConnection(lastSignedInAccount)
    }
    lastSignedInAccount != null -> {
        // 账号不匹配,先登出再登录目标账号
        googleSignInClient.signOut().addOnCompleteListener {
            startTargetAccountSignIn()
        }
    }
    else -> {
        // 无已登录账号,直接启动登录流程
        startTargetAccountSignIn()
    }
}

启动登录流程(推荐用Activity Result API)

// 在Activity中注册Activity Result回调
private val signInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
        handleSignInResult(task)
    }
}

private fun startTargetAccountSignIn() {
    val signInIntent = googleSignInClient.signInIntent
    signInLauncher.launch(signInIntent)
}

private fun handleSignInResult(task: Task<GoogleSignInAccount>) {
    try {
        val account = task.getResult(ApiException::class.java)
        if (account.email == targetAccountEmail) {
            initDriveConnection(account)
        } else {
            // 提示用户选择配置的目标账号
        }
    } catch (e: ApiException) {
        // 登录失败,处理错误(比如弹出提示)
    }
}

4. 初始化Google Drive连接

拿到匹配的账号后,初始化Drive客户端并验证连接:

private fun initDriveConnection(account: GoogleSignInAccount) {
    val driveClient = Drive.getDriveResourceClient(context, account)
    // 请求同步,验证Drive连接状态
    driveClient.requestSync()
        .addOnSuccessListener {
            // Drive连接成功,可执行文件操作(读取、上传等)
        }
        .addOnFailureListener { e ->
            // 连接失败,处理异常(比如重新触发登录)
        }
}

5. 处理异常与边界情况

  • 如果配置的目标账号未在设备的Google账号列表中,无法自动登录,需引导用户添加该账号
  • 监听Drive操作的认证失败事件,当凭据过期时重新启动登录流程
  • 可将目标账号信息存在SharedPreferences中,避免硬编码

6. 功能测试

  • 在测试设备添加目标账号,验证启动时是否自动完成Drive连接
  • 测试账号不匹配时的登出切换逻辑
  • 测试无账号时的登录引导流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:33:13