【问题标题】:GMail API Grant Permissions Before UserRecoverableAuthUIExceptionGMail API 在 UserRecoverableAuthUIException 之前授予权限
【发布时间】:2016-12-29 22:21:51
【问题描述】:

我已按照 Google 的快速入门示例设置 GMail API:https://developers.google.com/gmail/api/quickstart/android

我的应用成功请求 GET_ACCOUNTS 权限,并允许用户选择他/她的 gmail 帐户。所选帐户保存在 SharedPreferences 中以供以后访问。

通过 IntentService,我的应用程序会发送一封电子邮件。我已按照此处的说明进行操作:https://developers.google.com/gmail/api/guides/sending,并根据需要包含了 activation.jar、additional.jar 和 mail.jar 库。当我使用以下代码发送电子邮件时,我收到UserRecoverableAuthUIException

message = service.users().messages().send(userId, message).execute();

当我捕捉到异常,获取与异常一起存储的意图,并将意图作为新活动启动时,我会看到一个对话框,让我有机会允许我的应用使用我的 GMail 帐户发送电子邮件:

在此对话框上按“允许”后,我的应用程序会发送电子邮件而没有任何进一步的问题。我的应用程序也出现在我的 Google 帐户的在线权限页面上,说它有权发送电子邮件。

有没有办法在我第一次获取用户的帐户名时手动触发此对话框,而不是等待异常发生?

更新

如果有帮助的话,我已经能够提取存储在意图中的操作和数据:

  • 操作: com.google.android.gms.ui.UNPACKING_REDIRECT
  • 数据: intent://com.google.android.gms.auth.uiflows.common/KEY

其中 KEY 是一系列字符,可能与我的帐户相关联或者是一个令牌。

编辑:

以下是创建 Credentials 对象并启动我正在使用的帐户选择器活动的代码:

private GoogleAccountCredential mCredential;
private static final String[] SCOPES = { GmailScopes.GMAIL_COMPOSE };

内部构造函数:

mCredential = GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), Arrays.asList(SCOPES))
                .setBackOff(new ExponentialBackOff());

我在哪里获得帐户:

private void chooseGMailAccount() {
        String accountName = this.getSharedPreferences(getString(R.string.shared_pref_main),
                Context.MODE_PRIVATE)
                .getString(getString(R.string.srd_pref_gmail_account), null);
        if (accountName != null) {
            mCredential.setSelectedAccountName(accountName);
            configureGMailAPI();
        } else {
            startActivityForResult(
                    mCredential.newChooseAccountIntent(),
                    REQUEST_ACCOUNT_PICKER);
        }
    }

【问题讨论】:

  • 尝试在注册时发送邮件,即在用户选择帐户后。此时它会捕获异常,一旦你得到这个异常就会显示这个弹出窗口。以后这个用户就好了。我想没有直接的方法来触发这个弹出窗口。根据developers.google.com/drive/android/auth。授权是为了响应在发送请求时收到错误而发生的。您的应用程序必须准备好捕获 UserRecoverableAuthIOException。这意味着用户需要
  • 奇怪的是你不能直接触发它。我觉得这将是目前唯一的路线。我可以尝试创建和删除空草稿,而不是发送电子邮件。直到本周晚些时候我才能实现这一点,但我会用结果更新原始帖子。

标签: android google-oauth gmail-api android-googleapiclient android-authenticator


【解决方案1】:

您可以尝试在清单中添加一些权限

<uses-permission android:name="com.google.android.gm.permission.WRITE_GMAIL" />
<uses-permission android:name="com.google.android.gm.permission.AUTO_SEND" />

它仍然需要 oAuth 进行用户身份验证,但会自动允许意图这些权限...

尚未测试,但它可能有效

【讨论】:

    【解决方案2】:

    尝试在注册时发送邮件,即在用户选择帐户后。此时它会捕获异常,一旦你得到这个异常就会显示这个弹出窗口。以后这个用户就好了。我想没有直接的方法来触发这个弹出窗口。根据developers.google.com/drive/android/auth。授权是为了响应在发送请求时收到错误而发生的。您的应用必须准备好捕获 UserRecoverableAuthIOException。这意味着用户需要授权该应用程序。在您的应用程序获得用户授权之前,您的应用程序无法执行任何操作。

    【讨论】:

      【解决方案3】:

      要在用户选择帐户时请求“管理草稿和发送电子邮件”权限,请在构建 GoogleAccountCredential 时在范围中包含 GmailScopes.GMAIL_COMPOSE

         import com.google.api.services.gmail.GmailScopes;
      
         String[] SCOPES = { GmailScopes.GMAIL_COMPOSE, GmailScopes.GMAIL_LABELS };
         int REQUEST_ACCOUNT_PICKER = 1001;
      
         GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
                  getApplicationContext(), Arrays.asList(SCOPES))
                  .setBackOff(new ExponentialBackOff());
      
         startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
      

      有关范围列表,请参阅 the Gmail API Javadoc

      【讨论】:

      • 嗯,这似乎是我已经得到的。我的活动的构造函数创建 GoogleAccountCredential 对象,完全如您的 sn-p 中所示。我将范围从我必须的范围更改为 GMAIL_COMPOSE,但这并没有解决问题。 startActivityForResult 在构造函数之外调用,但使用相同的凭证对象。
      猜你喜欢
      • 2021-07-02
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多