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();

例外をキャッチし、例外と共に保存されたインテントを取得し、インテントを新しいアクティビティとして開始すると、アプリが GMail アカウントでメールを送信できるようにするダイアログが表示されます。

UserRecoverableAuthIOException インテント アクティビティ

このダイアログで [許可] を押した後、アプリは問題なくメールを送信します。私のアプリは、オンラインの 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);
        }
    }
4

3 に答える 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が必要ですが、これらのアクセス許可を自動的にインテントに許可します...

テストしていませんが、動作する可能性があります

于 2017-01-10T19:45:02.120 に答える
0

ユーザーがアカウントを選択するときに「下書きの管理とメールの送信」権限を要求するにはGmailScopes.GMAIL_COMPOSE、ビルド時にスコープに含めますGoogleAccountCredential

   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を参照してください。

于 2017-01-06T10:04:54.777 に答える