【问题标题】:Getting Android owner's email address nicely很好地获取 Android 所有者的电子邮件地址
【发布时间】:2011-09-24 00:38:15
【问题描述】:

我想让用户在不输入的情况下向我提供他们的电子邮件地址。理想情况下,应该有一个文本字段,用户可以在其中输入电子邮件地址或按下按钮自动填充它。

在前面的问题中,Roman Nurik suggests using an AccountManager 来处理这个问题,但这需要我的应用程序使用 GET_ACCOUNTS 权限;然后我的应用程序可以访问设备上所有用户的帐户,包括他们的 Facebook/Twitter 帐户。对于我想要的,这个权限似乎太宽泛了。

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

【问题讨论】:

  • 提出问题后我注意到的一件事是 GET_ACCOUNTS 权限通常隐藏在“更多详细信息”部分中;它不会出现在首屏特权列表中。因此,如果您请求此权限,大多数用户都不会注意到。
  • 你真的觉得GET_ACCOUNTS有那么重吗? GCM 需要它(至少如果你想支持
  • 您是否也需要申请此权限?用户可以禁用它吗?

标签: android permissions


【解决方案1】:

我知道我来得太晚了,但这可能对其他人有用。

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

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

您的应用需要包含Google Play Services auth 库com.google.android.gms:play-services-auth,但它不需要任何权限。

整个过程在旧版本的 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);
        }
    }

【讨论】:

  • 我喜欢这种方法,它适用于我使用的 4.0.3 平板电脑,我一定会在其他设备上测试 :) 谢谢!
  • 有很多设备不符合 Google 设置的要求,因此无法访问 G-apps,包括 Google Play。他们必须从其他市场安装应用程序或下载 APK 文件。即使比例很小,您也必须始终考虑应用中的所有场景。
  • 在 4 种不同的设备上测试并且工作 [从 Android 4.x 到 Android 5.1],这种方法适用于所有设备:Galaxy Note 4、HTC One X+、Sony Xperia 和 Nexus7 平板电脑。谢谢!
  • @semicircle21 出于某种原因,仅添加的权限是与互联网相关的内容和“防止手机休眠”。与联系人/帐户无关。我现在已经在多个 Android 设备和版本上对其进行了测试。另外,顺便说一句,从 Android 6 开始,您可以使用:AccountManager.newChooseAccountIntent
  • 准确来说,需要包含com.google.android.gms:play-services-auth:17.0.0
【解决方案2】:

确实,如果没有 GET_ACCOUNTS,您不仅无法做到这一点,而且您想要的信息只存在于用户 (Google) 的帐户数据中。

在我的 Sprint 手机上,sprint 分配的“所有者”地址是 myusername@sprintpcs.com,这可以在 shell 中使用 getprop 看到。但这不是我的主要电子邮件地址,甚至不是我曾经使用/检查过的电子邮件地址。您想要的是我的 gmail 地址,它存储在 Android 帐户数据中。

实际上,您需要 两个 中的一个 - 这是您需要 GET_ACCOUNTS 的另一个原因。如果您要询问我的电子邮件地址,您需要让我在设备上配置的两个@gmail.com 帐户中进行选择。 知道哪一个是我的“首选”(尽管这是上下文相关的),但系统认为 AFAIK 两者都不比另一个更“主要”或“默认”。

【讨论】:

    【解决方案3】:

    在不请求 GET_ACCOUNTS 权限的情况下,没有很好的方法可以访问用户的帐户(电子邮件)信息。 :-)

    【讨论】:

      【解决方案4】:

      另一种方法可能是查找与设备关联的 Google 用户名,您可以从中重建 user@gmail.com 地址,但这仍然需要使用 AccountManager。见Accessing Google Account Id /username via Android

      【讨论】:

      • 我认为这甚至不是一种替代方法;这与 Roman 的建议(我在原始问题中链接)没有什么不同。它需要我 GET_ACCOUNTS,这对 IMO 来说太大了安全特权
      • 那么,我认为你的问题的答案是否定的。
      • 不要用这个,有些人有自定义域。
      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多