在Android中通过Google Identity获取授权用户邮箱及实现登出
解决谷歌Drive授权后获取用户邮箱及登出问题
一、获取授权用户的邮箱
要拿到用户邮箱,你需要添加额外的授权范围,再在授权成功后调用谷歌用户信息接口获取:
添加邮箱相关授权Scope
原代码里的requestedScopes仅包含Drive只读权限,需补充邮箱权限,比如用Scopes.EMAIL或PeopleServiceScopes.USERINFO_EMAIL:val requestedScopes = listOf( Scope(DriveScopes.DRIVE_READONLY), Scope(Scopes.EMAIL), // 核心邮箱权限 Scope(Scopes.PROFILE) // 可选,如需获取用户名等基础信息 )授权成功后调用接口拿邮箱
在授权成功的分支(包括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客户端的授权状态,以及清理本地存储的凭证:
调用官方signOut接口
新增登出方法,调用谷歌提供的signOut能力:private fun signOutGoogleDrive() { Identity.getAuthorizationClient(requireContext()) .signOut() .addOnSuccessListener { // 登出成功后清理本地数据 GDriveClient.googleCredentialToken = null // 这里可跳转回登录页或更新UI状态 Log.d(TAG, "谷歌Drive用户已登出") } .addOnFailureListener { e -> Log.e(TAG, "登出操作失败", e) } }清理本地状态
登出成功后,务必清空本地存储的googleCredentialToken,如果有Drive客户端实例也需要销毁,避免后续请求使用过期凭证。
注意事项
- 添加新Scope后,用户首次授权会看到额外的权限申请弹窗,需用户确认同意。
- 调用Userinfo接口前,确保Manifest中已声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Abdullah Al Nahian Kanon
相关产品推荐
相关产品推荐

