Android:无需可怕的(用户)权限即可获取用户ID?

2024-04-15

为了管理用户偏好,目前我正在获取谷歌用户名(实际上是他们在设备上注册的电子邮件地址)并使用它(的散列)作为“用户ID”来区分不同的用户。与所描述的内容相符的东西here https://stackoverflow.com/a/4039018/4070848.

一切都很好,但一些用户(可以理解)被任何似乎赋予应用程序一些邪恶力量来搜寻他们的帐户信息或联系人的权限吓坏了。

编辑:这个问题对于谷歌现在实施的方式来说更加严重权限组 http://developer.android.com/guide/topics/security/permissions.html#perm-groups在安卓6中运行时权限 http://developer.android.com/training/permissions/requesting.html架构。他们已经把GET_ACCOUNTS进入CONTACTS权限组。现在,为了生成唯一的匿名用户 ID,必须向用户显示一个对话框,其中显示:

允许此应用访问您的联系人吗? |否认|允许 |

这是多么误导人啊??我的应用程序不想访问联系人,但系统要求用户授予应用程序访问联系人的权限!是的,有机会通过单独的对话框向用户解释,事实上,不需要访问联系人,但随后他们仍然会收到股票系统对话框,要求他们授予访问联系人的权限......自然地,他们会想“如果不需要访问联系人,为什么要要求我授予此权限?”以及“我真的信任开发人员吗?他们说不需要访问联系人,但这是真的吗?”...非常非常令人困惑,用户体验非常差,恕我直言(以及其他人也是如此 https://code.google.com/p/android/issues/detail?id=189766).

我宁愿避免所有这些麻烦和混乱,并获得唯一的用户 ID,而不需要特殊权限。

那么SDK中是否有一个库存函数或方法可以为用户返回唯一的用户ID,而不需要任何额外的权限?如果没有,我会感到有点惊讶,因为拥有一个用于管理应用程序用户的用户 ID 似乎是一件很常见的事情。

两点:

(a) 我只需要一个匿名用户 ID...我实际上不需要用户的电子邮件地址,也不会想要用户的电子邮件地址。所以我不明白为什么谷歌不能提供getUserID()返回唯一的匿名 ID 的方法,无需向应用程序授予特殊权限。

(b) 它必须是用户 ID,而不是设备 ID,以便它可以在注册到同一 Google 帐户的所有用户设备上运行。

Thanks.


如果您使用 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 http://developer.android.com/reference/android/app/Activity.html#onActivityResult(int,%20int,%20android.content.Intent)获取帐户类型和帐户名称:

@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);
}

source: https://stackoverflow.com/a/19444640/1048340 https://stackoverflow.com/a/19444640/1048340

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:无需可怕的(用户)权限即可获取用户ID? 的相关文章

随机推荐

  • 使用嵌套面板

    尝试为我的游戏构建一个 GUI 但无论我使用什么布局 我都无法让面板嵌套来做我喜欢的事情 我的目标是这个http i182 photobucket com albums x202 NekoLLX CharGenmockup 1 jpg ht
  • 使用 Cp500 编码陌生事物(LF 和 NEL)

    最近 在从字节转换为字符串 然后再从字符串转换为字节的过程中 我遇到了 Cp500 EBCDIC 编码的奇怪问题 问题在于一个特定的角色就是在这个转变过程中 被转变为这个角色 下面的代码验证了这一点 byte b25 0x25 byte b
  • 挑战:重新编码 data.frame() — 使其更快

    重新编码是调查数据的常见做法 但最明显的路线花费的时间比应有的时间要多 使用提供的示例数据完成相同任务的最快代码system time 在我的机器上获胜 Sample data dat lt cbind rep 1 5 50000 rep
  • 无法将 TensorFlow 保存的模型转换为 tfjs_layers_model webmodel

    我正在尝试将 TensorFlow 保存的模型转换为 tfjs webmodel 但它给出了ValueError 我使用的代码可以找到here https github com PatrickLib captcha recognize 我有
  • 在 C++ 类中创建二维向量

    我需要创建一个充满整数的向量向量 但是 我不断收到错误 错误 数字常量之前的预期标识符 错误 数字常量之前应有 或 using namespace std class Grid public Grid void display grid v
  • Google App Engine (java) 服务类是线程安全的吗?

    是否可以从工厂获取一次对服务的引用并使用它来处理多个请求 使用以下 servlet 伪代码可以最好地解释这一点 SomeServlet MemcacheService memcacheService MemcacheServiceFacto
  • 对于Intel Haswell上的XMM/YMM FP操作,可以使用FMA代替ADD吗?

    这个问题适用于 Haswell 上带有 XMM YMM 寄存器的打包 单精度浮点运算 所以根据awesome awesome table http www agner org optimize instruction tables pdf由
  • 计算每个会计年度的不同日期并在查询结果中显示所有日期

    CREATE TABLE customers id int auto increment primary key order date DATE customerID VARCHAR 255 INSERT INTO customers or
  • .split(" ") 与 .split() 之间有区别吗[重复]

    这个问题在这里已经有答案了 之间有根本的区别吗 split vs split 在Python中 我相信 split 的默认值是空格 因此两者应该相同 但我在 hackerrank 上得到不同的结果 根据docs https docs pyt
  • 如何修复传递参数报告 rdlc winform 时本地处理异常未处理的错误?

    我正在做大学项目 在这一点上 他们想要一个真正的证书 为此 我计划通过TextBox要报告的字符串 我在 google 上搜索了如何在 winform 中传递参数 然后我得到了这个一步一步的过程 我执行那个 Step 1 在 Visual
  • java:如何检查整个ArrayList的类型

    我知道如何硬编码一种算法来检查 arraylist 中每个对象的类型 但是有没有其他方法可以一次性检查 ArrayList 的类型 我的意思是我的应用程序只有三种类型的 arraylist 假设我有一个返回 ArrayList 的函数 它的
  • 为什么当我将 js 函数分配给局部变量时会失败?

    在 clojurescript 1 9 89 和 Chrome 50 0 2661 102 中 我可以创建如下日志语句 js console log works 但我无法创建这样的一个 def brokenlog js console lo
  • 在透明 JPanel 上绘画时留下痕迹

    我是一个相对较新的 Java 图形程序员 这是我正在尝试的一个简单程序 这是完整的代码 分为 3 个类 Class 1 import javax swing import java awt import java awt event pub
  • 捆绑包安装在 Nokogiri 停止

    我尝试在 Rails 应用程序上进行捆绑安装 但它卡在 安装 nokogiri 处 错误消息底部的说明显示 Make sure that gem install nokogiri v 1 5 5 succeeds before bundli
  • 用于提前退出循环的功能代码

    如何以函数式风格重构此代码 scala 惯用 def findFirst T objects List T T for obj lt objects if expensiveFunc obj null return obj null asI
  • NSString 地址问题

    我正在尝试将地址打印到字符串 但我在第一个 NSLog 中得到不同的地址 而在第二个 NSLog 中得到相同的地址 那么你能告诉我这是怎么回事吗 这真的让我很困惑 预先非常感谢您的努力 NSString str1 NSString allo
  • VS 2012 调试处理 时出现意外的符号读取器错误

    我在 Visual Studio 2012 中调试程序时遇到问题 当我尝试通过插入一些断点来调试代码时 它们似乎不起作用 当我将鼠标悬停在它们上时 会弹出一条消息 The breakpoint will not currently be h
  • Angular 6 不向 http 请求添加 X-XSRF-TOKEN 标头

    我读了the docs https angular io guide http security xsrf protection以及有关 SO 的所有相关问题 但 Angular CSRF 机制仍然对我不起作用 我无论如何都无法发出自动附加
  • PHP 相当于 JavaScript 的 substring()

    JavaScript 有两个方便的子字符串函数 substring from to and substr start length 这意味着我可以决定 当我从位置 X 开始获取子字符串时 我是否要指定结束的字符串位置或子字符串的长度 一个很
  • Android:无需可怕的(用户)权限即可获取用户ID?

    为了管理用户偏好 目前我正在获取谷歌用户名 实际上是他们在设备上注册的电子邮件地址 并使用它 的散列 作为 用户ID 来区分不同的用户 与所描述的内容相符的东西here https stackoverflow com a 4039018 4