将 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 错误,其所需类型为ScopeGmailScopes.GMAIL_READONLY 为String 类型。 Gmail Java 快速入门使用字符串列表定义范围:

Collections.singletonList(GmailScopes.GMAIL_LABELS);

但是将其与

.requestScopes(Collections.singletonList(GmailScopes.GMAIL_LABELS))

给出相同的类型错误,自然是使用 Mutable List&lt;String&gt; 而不是之前的 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 时如何定义范围?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?

如何将CMD窗口背景改成透明?