这一切都很好,但是有些用户(可以理解的)被任何许可吓倒,似乎给应用程序一些邪恶的力量通过他们的帐户信息或联系人拖网.
编辑:这个问题对于Google现在在Android 6 runtime permission架构中实现Permission Groups的方式更为尖锐.他们已将GET_ACCOUNTS放入CONTACTS权限组.所以现在,为了生成一个独特的匿名用户ID,用户必须显示一个对话框,说:
Allow this app to access your contacts? | Deny | Allow |
这个误会怎么样?我的应用程序不希望访问联系人,但是要求用户授予该应用访问联系人的权限!是的,有机会向用户解释一个单独的对话框,实际上访问联系人并不是必需的,但是他们仍然获得了库存系统对话框,要求他们授予访问联系人的权限.会想到“如果不需要访问联系人,为什么要被要求授予此权限?” “我真的相信开发人员吗?他们说接触联系不是必需的,但这是真的吗?”…非常混乱和非常糟糕的用户体验IMHO(和others too的意见).
我宁愿避免所有这些麻烦和混乱,并获得唯一的用户ID,而不需要特殊的权限.
SDK中有库存函数还是方法,将返回用户的唯一用户ID,而不需要任何其他权限?如果没有,我很惊讶,因为想要做…似乎有一个常见的事情是拥有管理应用程序用户的用户ID.
两点:
(a)我只需要匿名用户ID …我实际上并不需要用户的电子邮件地址,也不会想要用户的电子邮件地址.所以我不明白为什么谷歌不能提供一个getUserID()方法返回一个唯一的匿名ID,而不必授予应用程序的特殊权限.
(b)它必须是用户ID,而不是设备ID,以便它可以在注册到同一个Google帐户的所有用户的设备上工作.
谢谢.
解决方法
首先,将以下依赖项添加到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); 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); }