【问题标题】:Using GMail API on Android without having to use GET_ACCOUNTS permission在 Android 上使用 GMail API 而无需使用 GET_ACCOUNTS 权限
【发布时间】:2019-05-19 06:09:54
【问题描述】:

只是我的代码的快速 sn-p:

初始化:

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

在哪里检查数据访问:

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 权限? :(

【问题讨论】:

    标签: android gmail gmail-api


    【解决方案1】:

    从这个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);
        }
    }
    

    【讨论】:

    • 似乎您只是在检索电子邮件...我的目的是访问用户的 gmail 帐户
    • 是的,您可以尝试获取 gmail 帐户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2020-09-07
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多