只是我的代码的简短摘要:
初始化:
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权限吗? :(
答案 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);
}
}