将 GoogleSignInOptions.requestScopes() 用于 Gmail API 时如何定义范围?
Posted
技术标签:
【中文标题】将 GoogleSignInOptions.requestScopes() 用于 Gmail API 时如何定义范围?【英文标题】:How does one define scopes when using GoogleSignInOptions.requestScopes() for Gmail API? 【发布时间】:2020-09-01 10:26:41 【问题描述】:问题:
如何为GoogleSignInOptions.Builder()
定义 Gmail API 范围?
总结:
我有一个用 Kotlin 编写的 android 应用程序,我试图在其中集成对 Gmail API 的调用,但在请求范围时无法添加 GMAIL_READONLY
范围。
相关信息和我的尝试:
来自文档here:
...要配置 Google 登录以请求用户的 ID 和基本个人资料信息,请使用
DEFAULT_SIGN_IN
参数创建一个GoogleSignInOptions
对象。要同时请求用户的电子邮件地址,请使用requestEmail
选项创建GoogleSignInOptions
对象。如果您需要请求其他范围来访问 Google API,请使用
requestScopes
指定它们。
我的应用程序 gradle 文件中有来自 Java Gmail Quickstart 的 Google API 客户端和 Gmail 服务依赖项:
implementation 'com.google.api-client:google-api-client:1.23.0'
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0'
implementation 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0'
在相应的片段中,我有一个setOnClickListener
用于进行 API 调用的按钮。按照之前链接的“将 Google 登录集成到您的 Android 应用程序”页面上的步骤,我有以下代码 sn-p:
view.findViewById<Button>(R.id.google_sign_in_button).setOnClickListener
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build()
但是,当我尝试添加 Gmail.READONLY 范围时,我遇到了构建错误。
示例:
使用以下声明
val gmailScope = Scope(GmailScopes.GMAIL_READONLY)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestScopes(GmailScopes.GMAIL_READONLY)
.build()
给出Type mismatch
错误,其所需类型为Scope
且GmailScopes.GMAIL_READONLY
为String 类型。 Gmail Java 快速入门使用字符串列表定义范围:
Collections.singletonList(GmailScopes.GMAIL_LABELS);
但是将其与
.requestScopes(Collections.singletonList(GmailScopes.GMAIL_LABELS))
给出相同的类型错误,自然是使用 Mutable List<String>
而不是之前的 String。
此Google APIs for Android 页面上记录的Scope
类将构造函数定义为:
Scope(String scopeUri)
:使用给定的 URI 创建一个新范围。
所以我尝试使用这个类来实现:
val gmailScope = Scope(GmailScopes.GMAIL_READONLY)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestScopes(gmailScope)
.build()
也可以直接用URI:
val gmailScope = Scope("https://www.googleapis.com/auth/gmail.readonly")
但是这会产生Unresolved refernce: Scope
错误。我听从了this question 的建议,但无济于事。
【问题讨论】:
【参考方案1】:答案:
.kt
文件缺少从android.gms.common.api
导入的Scope
类。
导入行:
import com.google.android.gms.common.api.Scope
【讨论】:
以上是关于将 GoogleSignInOptions.requestScopes() 用于 Gmail API 时如何定义范围?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等