GMail API授权权限在UserRecoverableAuthUIException之前授予

7
我按照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();

当我捕获异常、获取存储在异常中的Intent并将其作为新活动启动时,会显示一个对话框,让我有机会允许我的应用使用GMail帐户发送电子邮件:UserRecoverableAuthIOException Intent Activity。在此对话框上按“允许”后,我的应用程序可以无需进一步操作即可发送电子邮件。我的应用程序也出现在我的Google帐户权限页面上,表示它已被授权发送电子邮件。 是否有办法在我首次获取用户帐户名时手动触发此对话框,而不是等待异常发生? 更新: 如果有需要,我已经能够提取存储在Intent中的操作和数据:
- 操作: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);
        }
    }

1
尝试在用户选择帐户后注册时发送邮件。此时它将捕获异常,一旦您得到此异常,就会显示此弹出窗口。之后,用户就可以开始使用了。我猜没有直接触发此弹出窗口的方法。根据https://developers.google.com/drive/android/auth。授权是在收到发送请求时出现错误时发生的。您的应用程序必须准备好捕获UserRecoverableAuthIOException。这意味着用户需要 - avinash
很奇怪你无法直接触发这个。我感觉这将是目前唯一的路线。与其发送邮件,我可以尝试创建并删除一个空草稿。我要到本周晚些时候才能实现这一点,但我会用结果更新原帖。 - Programmer001
3个回答

2

你可以尝试在你的清单文件中添加一些权限。

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

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

尚未测试,但可能有效。


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

0

当用户选择帐户时请求“管理草稿和发送电子邮件”权限,请在构建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);

请参阅Gmail API Javadoc以获取范围列表。


嗯,看起来这就是我已经拥有的。我的活动构造函数正如您的片段所示创建了GoogleAccountCredential对象。我将范围从我原来的更改为仅GMAIL_COMPOSE,但这并没有解决问题。startActivityForResult在构造函数之外调用,但使用相同的凭据对象。 - Programmer001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接