很好地获取Android所有者的电子邮件地址
我希望允许用户在不input的情况下为我提供他们的电子邮件地址。理想情况下,会有一个文本字段,用户可以input电子邮件地址或按下button来自动填充。
在之前的问题中, Roman Nurikbuild议使用AccountManager来处理这个问题,但这需要我的应用程序使用GET_ACCOUNTS权限; 我的应用程序可以访问设备上的所有用户帐户,包括他们的Facebook / Twitter帐户。 这个许可似乎太宽泛,我想要的。
有没有更好的方式来处理这个不需要授予我的应用程序如此沉重的权限?
事实上,您不仅不能在没有GET_ACCOUNTS的情况下执行此操作,您只需要在用户的(Google)帐户数据中存在您想要的信息。
在我的Sprint手机上,sprint所分配的“所有者”地址是myusername@sprintpcs.com
,可以使用shell中的getprop
来查看。 但这不是我的主要电子邮件地址,甚至我曾经使用/检查。 你想要的是我的Gmail地址,这是存储在Android帐户数据。
其实,你想要两个之一 – 这是你需要GET_ACCOUNTS的另一个原因。 如果您打算询问我的电子邮件地址,则需要让我在设备上configuration的两个@ gmail.com帐户中进行select。 我知道哪一个是我的“首选”(尽pipe这是上下文),但AFAIK既不被系统认为是比其他的更“主要”或“违约”。
我知道我太晚了,但这可能对别人有用。
我认为自动填充电子邮件字段的最好方法是使用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); } }
另一种方法可能是查找与设备关联的Google用户名,您可以从中重新构builduser@gmail.com
地址,但仍需要使用AccountManager。 请参阅通过Android访问Google帐户ID /用户名 。
没有好的方法来访问用户的帐户(电子邮件)信息,而不要求GET_ACCOUNTS权限。 🙂