很好地获取Android用户的电子邮件地址

Dan*_*ich 42 permissions android

我想允许用户在没有输入的情况下向我提供他们的电子邮件地址.理想情况下,有一个文本字段,用户可以键入电子邮件地址或按下按钮自动填充它.

在之前的一个问题中,Roman Nurik建议使用AccountManager来处理这个问题,但这需要我的应用程序使用GET_ACCOUNTS权限; 然后我的应用程序可以访问设备上的所有用户帐户,包括他们的Facebook/Twitter帐户.这个许可对我想要的东西来说似乎过于宽泛.

有没有更好的方法来处理这个不需要授予我的应用程序这么重的权限?

Jor*_*los 119

我知道我已经太晚了,但这可能对其他人有用.

我认为现在自动填充电子邮件字段的最佳方法是使用AccountPicker

如果您的应用具有GET_ACCOUNTS权限并且只有一个帐户,则可以立即获得.如果您的应用没有,或者有多个帐户,则用户会收到提示,以便他们可以授权或不授权操作.

您的应用需要包含Google Play服务,但不需要任何权限.

整个过程将在旧版本的Android上失败(需要2.2+),或者如果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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 有很多设备不符合Google的要求,因此无法访问G-app,包括Google Play.他们必须从备用市场安装应用程序或下载APK文件.即使它只是一小部分,您也必须始终考虑应用中的所有方案. (18认同)
  • 在4种不同的设备上进行测试并且[从Android 4.x到Android 5.1]工作,这种方法适用于所有这些:Galaxy Note 4,HTC One X +,Sony Xperia和Nexus7平板电脑.谢谢! (2认同)
  • @ semicircle21由于某种原因,只有添加的权限是与互联网相关的东西,并"防止手机休眠".与联系人/帐户无关.我现在已在多个Android设备和版本上测试过它.此外,BTW,从Android 6开始,您可以使用:AccountManager.newChooseAccountIntent (2认同)

FeR*_*eRD 19

实际上,如果没有GET_ACCOUNTS,您不仅不能这样做,您想要的信息只存在于用户的(Google)帐户数据中.

在我的Sprint手机上,sprint指定的'所有者'地址是myusername@sprintpcs.com,并且可以getprop从shell中看到.但这不是我的主要电子邮件地址,甚至是我曾经使用/检查过的地址.你想要的是我的Gmail地址,并存储在Android帐户数据中.

实际上,你想要两个中的一个 - 这是你需要GET_ACCOUNTS的另一个原因.如果您要询问我的电子邮件地址,您需要让我在设备上配置的两个@ gmail.com帐户中进行选择.知道哪一个是我的'首选'(虽然即使是上下文),但系统认为AFAIK不比另一个更"主要"或"默认".