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