安卓 M 邮件自动补全

3

正如您所知,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上,为了继续使用此功能,我需要请求用户的权限以读取其账户。这并不合理,因为为了节省用户一点时间,我需要使用一个烦人的权限请求。
有没有另一种方法可以自动完成用户电子邮件而不需要请求任何权限?

GET_ACCOUNTS权限是联系人权限组的一部分。这意味着如果您要求用户授予此权限,系统将询问该应用是否被允许访问联系人...这甚至更糟糕。 - Floern
1个回答

3
谷歌游戏服务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();
        }
    }

    ...

}

我已经为我的应用程序进行了测试,credential.getId() 包含您可以在选择后用于预填表单字段的电子邮件地址。最终我没有使用它,因为它只提供使用 Google 帐户的选项,但是如果您只想要一个电子邮件地址,它非常有效!


明天我会检查!非常感谢。 - Spotlight
好的,它似乎可以工作,但是显示对话框就像输入整个电子邮件地址一样不方便。 - Spotlight
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Steven
我是谷歌的产品经理,负责这个API:我们进行了显示对话框与让用户输入电子邮件地址的A/B实验,结果显示使用对话框的成功完成率约高15%,尽管我们正在考虑其他样式,例如底部工具栏UI。 - Steven
@StevenSoneff 这个对话框很好看,问题是它只支持Google账户。对于我个人而言,你需要使用Microsoft Exchange账户来登录我的应用程序,否则它就没用了,我会失去所有自动完成的功能,如果我不提示访问账户,这是不好的。 - davidhodges86
我明白了,让我研究一下如何添加它。与筛选开发人员指定的帐户类型结合使用可能效果很好,例如,您可以指定仅显示 Microsoft 的帐户类型。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接