如您所知,Android M上的权限系统已更新。
我目前使用权限GET_ACCOUNTS在我的应用登录/注册时自动填写用户电子邮件。
final ArrayList<String> emails = new ArrayList<String>();
for (Account account : AccountManager.get(this).getAccounts()) {
emails.add(account.name);
}
email.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, emails));
问题是在Android M上,要继续使用此功能,我需要请求用户阅读其帐户的权限。这没有意义,因为为了节省用户一点时间我需要使用恼人的权限请求。
还有另一种方法可以在不要求任何许可的情况下自动填充用户电子邮件吗?
答案 0 :(得分:3)
Google Play Services 8.3添加了提示信息,可用于自动填充电子邮件地址
http://android-developers.blogspot.co.uk/2015/11/whats-new-in-google-play-services-83.html
为了在各种设备上轻松登录,无论您使用Google登录还是仍然使用基于密码的身份验证,Smart Lock API都会收到一些重要更新。我们添加了一个新的API方法,以显示一个对话框,帮助您的用户选择以前使用过的电子邮件地址,以便轻松预先填写登录或更新表单:查看getHintPicker。这不需要任何设备权限,并提供了您之前可能从设备上的帐户填充的选择器的替代方法,现在需要Marshmallow的运行时权限。
https://developers.google.com/identity/smartlock-passwords/android/retrieve-hints
HintRequest hintRequest = new HintRequest.Builder()
.setHintPickerConfig(new CredentialPickerConfig.Builder()
.setShowCancelButton(true)
.build())
.setEmailAddressIdentifierSupported(true)
.build();
PendingIntent intent =
Auth.CredentialsApi.getHintPickerIntent(mCredentialsClient, hintRequest);
try {
startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Could not start hint picker Intent", e);
}
提示用户选择要使用的电子邮件地址。
然后,在活动的onActivityResult()方法中,从Credential.EXTRA_KEY包中检索提示,检查用户是否在您的用户数据库中,并使用凭据提示启动相应的活动。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_HINT) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
Intent intent;
// Check for the user ID in your user database.
if (userDatabaseContains(credential.getId())) {
intent = new Intent(this, SignInActivity.class);
} else {
intent = new Intent(this, SignUpNewUserActivity.class);
}
intent.putExtra("com.mycompany.myapp.SIGNIN_HINTS", credential);
startActivity(intent);
} else {
Log.e(TAG, "Hint Read: NOT OK");
Toast.makeText(this, "Hint Read Failed", Toast.LENGTH_SHORT).show();
}
}
...
}
我已经为我的应用测试了它,凭据.getId()包含您可以用来在选择后预填充表单字段的电子邮件地址。最后我没有使用它,因为它只提供使用Google帐户的选项,但如果您只是想要一个电子邮件地址,那么它的效果非常好!