Просто небольшой фрагмент моего кода:
Инициализировать:
mCredential = GoogleAccountCredential.usingOAuth2(
getApplicationContext(), SCOPES)
.setBackOff(new ExponentialBackOff());
Затем запускаю селектор:
startActivityForResult(mCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
Затем в ActivityForResult
if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
if (accountName != null) {
PersistentUtil.persistGmailName(this, accountName);
mCredential.setSelectedAccountName(accountName);
checkDataAccess();
}
}
Где checkDataAccess:
java.lang.Thread thread = new java.lang.Thread(new Runnable() {
@Override
public void run() {
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
Gmail mService = new com.google.api.services.gmail.Gmail.Builder(
transport, jsonFactory, mCredential)
.setApplicationName(getResources().getString(R.string.app_name))
.build();
try {
Gmail.Users users = mService.users();
Gmail.Users.Messages messages = users.messages();
Gmail.Users.Messages.List me = messages.list("me");
ListMessagesResponse temp = me.execute();
// if no error is thrown then, we are good to go
onGmailFinished();
// parseMessageList(mService, temp);
} catch (UserRecoverableAuthIOException e) {
startActivityForResult(
((UserRecoverableAuthIOException) e).getIntent(),
REQUEST_AUTHORIZATION);
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
ПРОБЛЕМА
ListMessagesResponse temp = me.execute();
в конечном итоге вызовет метод getAccounts()
, который ищет пользователя в учетных записях, настроенных на устройстве. Он вернет null, если разрешение GET_ACCOUNTS
не предоставлено.
КАК я могу сделать так, чтобы я не зависел от разрешения GET_ACCOUNTS, каким-либо способом настроить учетную запись Gmail независимо от учетных записей устройства? Я не хочу запрашивать разрешение GET_ACCOUNTS.
Есть ли способ сделать это, или мне всегда нужно использовать intentChooser и впоследствии зависеть от разрешения GET_ACCOUNTS? :(
В этом ТАК сообщение говорится, что лучше использовать Выбор учетной записи, в котором он возвращает намерение в Activity
, который предлагает пользователю выбрать из списка учетных записей.
If your app has the GET_ACCOUNTS permission and there's only one account, you get it right away. If your app doesn't have it, or if there are more than one account, users get a prompt so they can authorize or not the action.
Ваше приложение должно включать Сервисы Google Play, но не требует никаких разрешений.
Базовый пример кода:
private static final int REQUEST_CODE_EMAIL = 1;
private TextView email = (TextView) findViewById(R.id.email);
// ...
try {
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_EMAIL);
} catch (ActivityNotFoundException e) {
// TODO
}
// ...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
email.setText(accountName);
}
}
Да, вы можете попробовать это, чтобы получить учетную запись Gmail.
Кажется, вы получаете только электронную почту ... я намерен получить доступ к учетным записям gmail пользователей