5

Я следовал QUICKSTART пример из Google для настройки API GMail: https://developers.google.com/gmail/api/quickstart/androidGMail API предоставления разрешений До UserRecoverableAuthUIException

Мое приложение успешно запрашивает разрешение GET_ACCOUNTS и позволяет пользователю выбрать его/ее аккаунта Gmail. Выбранная учетная запись сохраняется в SharedPreferences для последующего доступа.

Через IntentService мое приложение отправляет электронное письмо. Я выполнил следующие инструкции: https://developers.google.com/gmail/api/guides/sending и включил библиотеки activ.jar, Additional.jar и mail.jar по мере необходимости. Когда я отправить почту с ниже код, я получаю UserRecoverableAuthUIException:

message = service.users().messages().send(userId, message).execute(); 

Когда я ловлю исключение, получить намерение хранящийся за исключением, и начать намерение как новый вид деятельности, я показал диалог давая мне возможность разрешить мое приложение для отправки электронной почты с моим счетом GMail:

UserRecoverableAuthIOException Intent Activity

После нажатия кнопки «Разрешить» в этом диалоге, мое приложение отправляет электронную почту без каких-либо дополнительных вопросов. Мое приложение также появляется на странице разрешений моей учетной записи Google в Интернете, в котором говорится, что у него есть разрешение на отправку электронной почты.

Есть ли способ запустить это диалоговое окно вручную, когда я впервые получаю имя учетной записи пользователя, а не ожидаю возникновения исключения?

UPDATE

Я был в состоянии извлечь действия и данные, хранящиеся в намерении, если это помогает любому:

  • действия: com.google.android.gms.ui .UNPACKING_REDIRECT
  • данные: цель: //com.google.android.gms.auth.uiflows.common/KEY

где KEY - это серия символов, возможно связанных с моей учетной записью или являющихся токеном.

EDIT:

Ниже приведен код для создания объекта по проверке полномочий и запуска счета сборщика деятельность, я использую:

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

Попробуйте отправить письмо во время регистрации i.e после того, как пользователь выберет учетную запись. В этот момент он будет перехватывать исключение, как только вы получите это исключение, покажите это всплывающее окно. После этого пользователя хорошо идти. Я думаю, нет прямого способа вызвать это всплывающее окно. В соответствии с https://developers.google.com/drive/android/auth. Авторизация происходит в ответ на получение ошибки при отправке запроса. Ваше приложение должно быть подготовлено, чтобы поймать UserRecoverableAuthIOException. Это означает, что пользователю нужно – avinash

+0

Невероятно, что вы не можете инициировать это напрямую. Я чувствую, что это будет единственный путь в этот момент. Вместо отправки электронной почты я мог бы попытаться создать и удалить пустой черновик. Я не смогу реализовать это до конца этой недели, но я буду обновлять исходное сообщение с результатами. – Programmer001

ответ

0

Попробуйте отправить письмо во время регистрации, то есть после того, как пользователь выберет учетную запись. В этот момент он будет перехватывать исключение, как только вы получите это исключение, покажите это всплывающее окно. После этого пользователя хорошо идти. Я думаю, нет прямого способа вызвать это всплывающее окно. Согласно developers.google.com/drive/android/auth. Авторизация происходит в ответ на получение ошибки при отправке запроса. Ваше приложение должно быть подготовлено, чтобы поймать UserRecoverableAuthIOException. Это означает, что пользователю необходимо авторизовать приложение. Пока ваше приложение не будет разрешено пользователем, ваше приложение ничего не сможет сделать.

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

См. the Gmail API Javadoc для получения списка областей применения.

+0

Хм, похоже, это то, что у меня уже есть. Конструктор моей активности создает объект GoogleAccountCredential точно так, как показано в вашем фрагменте. Я изменил область действия от того, что мне нужно было просто GMAIL_COMPOSE, и это не решило проблему. startActivityForResult вызывается вне конструктора, но использует тот же объект учетных данных. – Programmer001

1

Вы могли бы попытаться добавить несколько разрешений на свой манифест

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

И это должно еще нужно OAuth для аутентификации пользователя, но позволит умысел автоматически эти разрешения ...

Не проверял но это может сработать

Смежные вопросы