代码之家  ›  专栏  ›  技术社区  ›  AndreiBogdan

在Android上使用GMail API,而不必使用GET_ACCOUNTS权限

  •  0
  • AndreiBogdan  · 技术社区  · 6 年前

    只是我的代码片段:

    初始化:

        mCredential = GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), SCOPES)
                .setBackOff(new ExponentialBackOff());
    

    然后我启动选择器:

    startActivityForResult(mCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
    

    然后在活动中

    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帐户的方法?我不想请求获取帐户权限。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jessica Rodriguez    6 年前

    上面写着 SO post 最好使用 Account Picker 其中它将一个意图返回给 Activity 提示用户从帐户列表中进行选择。

    如果你的应用程序有 获取账户 只有一个 授权与否。

    你的应用程序需要包括 但它不需要任何权限。

    基本代码示例:

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