我按照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帐户的在线权限页面上显示,它有权发送电子邮件.
当我第一次获取用户的帐户名而不是等待发生异常时,有没有办法手动触发此对话框?
UPDATE
我已经能够提取存储在intent中的动作和数据,如果这有助于任何:
>动作:com.google.android.gms.ui.UNPACKING_REDIRECT
> data: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); } }