为了管理用户偏好,目前我正在抓取谷歌用户名(实际上是他们已经注册到设备的电子邮件地址)并使用(哈希)作为“用户ID”来区分不同的用户。所描述的内容here。
一切正常,但有些用户(可以理解地)被任何许可吓到了,这似乎会给应用程序一些邪恶的力量来搜索他们的帐户信息或联系人。
编辑:对于Google现在在Android 6 Permission Groups架构中实施runtime permission的方式,这个问题更为严重。他们已将GET_ACCOUNTS
放入CONTACTS
权限组。现在,为了生成唯一的匿名用户ID,必须向用户显示一个对话框,其中包含:
允许此应用访问您的联系人? |拒绝|允许|
这有多误导?我的应用程序不希望访问联系人,但要求用户授予该应用程序访问联系人的权限!是的,有机会向用户解释一个单独的对话框,事实上,不需要访问联系人,但他们仍然得到股票系统对话框,要求他们授予访问联系人的权限......自然他们会想“如果不需要访问联系人,为什么我被要求授予此权限?”并且“我真的相信开发者吗?他们说不需要访问联系人,但这是真的吗?”......非常混乱,用户体验非常差(恕我直言others too)。
我宁愿避免所有这些麻烦和困惑,并获得唯一的用户ID,而无需特殊权限。
SDK中是否有一个库存函数或方法,它将为用户返回唯一的用户ID,而不需要任何其他权限?如果没有,我会感到很惊讶,因为想要做的事情似乎很常见......拥有用于管理应用用户的用户ID。
两点:
(a)我只需要一个匿名用户ID ......我实际上并不需要用户的电子邮件地址,也不需要用户的电子邮件地址。因此,我无法理解为什么谷歌无法提供返回唯一匿名ID的getUserID()
方法,而无需向该应用授予特殊权限。
(b)它必须是用户ID,而不是设备ID,以便它可以在注册到同一个Google帐户的所有用户设备上运行。
感谢。
答案 0 :(得分:8)
如果您使用Google Play服务,则无需任何额外权限即可获取帐户类型和帐户名称。
首先,将以下依赖项添加到build.gradle:
compile 'com.google.android.gms:play-services-auth:8.4.0'
接下来,启动帐户选择器意图:
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE},
false, null, null, null, null);
try {
startActivityForResult(intent, REQUEST_CODE_EMAIL);
} catch (ActivityNotFoundException e) {
// This device may not have Google Play Services installed.
// TODO: do something else
}
最后,覆盖onActivityResult
以获取帐户类型和帐户名称:
@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);
String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
// TODO: do something with the accountName
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
答案 1 :(得分:2)
您可以使用AccountPicker 获取确切的Gmail电子邮件地址,而无需添加权限。
您的应用需要包含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);
}
}
上述信息的来源是:This Answer on SO - 过去提出的类似但略有不同的问题。
This Post - 也有一些很好的方法可以达到您的目的。
答案 2 :(得分:0)
您可以将Google广告ID用作UUID,但它不是跨设备的(但是?):
https://support.google.com/googleplay/android-developer/answer/6048248?hl=en
那至少可以摆脱可怕的许可请求。
我不相信Android / Google有一个不需要许可的跨设备UUID,但Google的Doubleclick据称正在开发一个。
答案 3 :(得分:-1)
不幸的是,没有办法解决这个问题,即使最基本的帐户访问也需要用户许可。