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
- データ:インテント://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);
}
}