Использование GMail API на Android без использования разрешения GET_ACCOUNTS - PullRequest
0 голосов
/ 18 декабря 2018

Просто быстрый фрагмент моего кода:

Инициализация:

    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(), который ищет пользователя в учетных записяхкоторые настроены на устройстве.Он вернет ноль, если разрешение GET_ACCOUNTS не предоставлено.

КАК я могу сделать так, чтобы я не зависел от разрешения GET_ACCOUNTS, каким-то образом настроить учетную запись gmail независимо от устройстваСчета?Я не хочу запрашивать разрешение GET_ACCOUNTS.

Есть ли способ сделать это или мне всегда нужно идти через intentChooser и впоследствии зависеть от разрешения GET_ACCOUNTS?(

1 Ответ

0 голосов
/ 19 декабря 2018

Из этого ТАКОГО сообщения говорится, что лучше использовать Сборщик учетных записей , в котором он возвращает намерение Activity, которое предлагает пользователю выбрать из спискаучетные записи.

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

В вашем приложении должен быть GooglePlay Services , но для этого не нужно никаких разрешений.

Базовый пример кода:

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