在Android上使用GMail API,而无需使用GET_ACCOUNTS权限

时间:2018-12-18 19:07:49

标签: android gmail gmail-api

只是我的代码的简短摘要:

初始化:

    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权限,它将返回null。

我如何做到这一点,以使我不依赖GET_ACCOUNTS权限(以某种方式独立于设备帐户配置gmail帐户)?我不想申请GET_ACCOUNTS权限。

有没有办法做到这一点,或者我以后总是必须通过intentChooser并依赖GET_ACCOUNTS权限吗? :(

1 个答案:

答案 0 :(得分:0)

从此SO post说起,最好使用Account Picker,其中它向Activity返回意图以提示用户从帐户列表中进行选择的意图。

  

如果您的应用具有 GET_ACCOUNTS 权限,并且只有一个   帐户,您马上就可以获取。如果您的应用程序没有它,或者   有多个帐户,用户会收到提示,以便他们可以   授权或不授权操作。

您的应用需要包含 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);
    }
}