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

在Android中通过Google Identity获取授权用户邮箱及实现登出

解决谷歌Drive授权后获取用户邮箱及登出问题

一、获取授权用户的邮箱

要拿到用户邮箱,你需要添加额外的授权范围,再在授权成功后调用谷歌用户信息接口获取:

  1. 添加邮箱相关授权Scope
    原代码里的requestedScopes仅包含Drive只读权限,需补充邮箱权限,比如用Scopes.EMAIL或PeopleServiceScopes.USERINFO_EMAIL:

    val requestedScopes = listOf(
        Scope(DriveScopes.DRIVE_READONLY),
        Scope(Scopes.EMAIL), // 核心邮箱权限
        Scope(Scopes.PROFILE) // 可选,如需获取用户名等基础信息
    )
    
  2. 授权成功后调用接口拿邮箱
    在授权成功的分支(包括handleAuthorizationResult方法内),用拿到的AccessToken调用谷歌Userinfo端点:

    // 示例:在授权成功逻辑中加入获取邮箱的代码
    lifecycleScope.launch(Dispatchers.IO) {
        try {
            val token = authorizationResult.accessToken
            val url = URL("https://www.googleapis.com/oauth2/v3/userinfo")
            val connection = url.openConnection() as HttpsURLConnection
            connection.setRequestProperty("Authorization", "Bearer $token")
            
            val response = connection.inputStream.bufferedReader().readText()
            val jsonObject = JSONObject(response)
            val userEmail = jsonObject.getString("email")
            
            // 这里可保存邮箱或做后续业务处理
            Log.d(TAG, "当前授权用户邮箱:$userEmail")
        } catch (e: Exception) {
            Log.e(TAG, "获取用户邮箱失败", e)
        }
    }
    

    这个方式无需额外引入依赖,直接通过HTTP请求即可获取,比调用People API更简洁。

二、实现登出功能

登出需要完成两步:清除谷歌Identity客户端的授权状态,以及清理本地存储的凭证:

  1. 调用官方signOut接口
    新增登出方法,调用谷歌提供的signOut能力:

    private fun signOutGoogleDrive() {
        Identity.getAuthorizationClient(requireContext())
            .signOut()
            .addOnSuccessListener {
                // 登出成功后清理本地数据
                GDriveClient.googleCredentialToken = null
                // 这里可跳转回登录页或更新UI状态
                Log.d(TAG, "谷歌Drive用户已登出")
            }
            .addOnFailureListener { e ->
                Log.e(TAG, "登出操作失败", e)
            }
    }
    
  2. 清理本地状态
    登出成功后,务必清空本地存储的googleCredentialToken,如果有Drive客户端实例也需要销毁,避免后续请求使用过期凭证。

注意事项

  • 添加新Scope后,用户首次授权会看到额外的权限申请弹窗,需用户确认同意。
  • 调用Userinfo接口前,确保Manifest中已声明网络权限:<uses-permission android:name="android.permission.INTERNET" />

内容的提问来源于stack exchange,提问作者Abdullah Al Nahian Kanon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:29:53