设置.Secure.ANDROID_ID不是唯一的,如何解决?

7

我现在面临一个大问题。根据Android官方参考文献中所述:

http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID


public static final String ANDROID_ID

*自API 3级别添加*

一个64位数字(作为十六进制字符串)在设备第一次启动时随机生成,应在设备的生命周期内保持不变。(如果在设备上执行了出厂设置,则该值可能会更改。) 常量值:“android_id”*


但是,对于已售出的500多台平板电脑(A10 AllWinner)ANDORID_ID并非真正随机生成的,我看到(从我的Web服务日志中)有几个设备有相同的号码!

为什么会这样?

我该如何解决这个问题?如何生成一个唯一的ID?假设序列码对所有设备始终相同(几个安卓设备都有相同的序列号。ADB是无用的。我该如何更改序列号?),MAC地址可能不总是可用。


你使用这个数字的目的需要唯一性吗? - CodesInChaos
我的应用程序使用C# Web服务来获取更新、发送数据...因此,在Web服务中,我想要识别每个我销售的平板电脑。如果两个或更多的平板电脑具有相同的标识号码,这将是一个大问题! - Seraphim's
2
值得注意的是,如果用户将其设备恢复出厂设置,Android ID 将被重置。 - Elemental
可能是重复的问题:Secure.ANDROID_ID对于每个设备是否唯一? - kellyfj
1个回答

11

总的来说,这是安卓系统的严重问题 - 看起来安卓ID是最佳选项,但正如您所提到的,一些重要的供应商在实现上搞砸了。

面对类似的要求,我使用了这些值的哈希值:

  • 电话号码/SIM卡号码(如果可用或者只使用零)
  • 安卓ID
  • Mac地址(如果可用或者只使用零)

根据我的有限经验(使用了几百台设备),这种组合已经足够实现所需的唯一性。

更新2017年 从安卓6开始,Mac地址出于安全原因返回一个常数值 - 然而在几乎所有新版的安卓实现中,安卓ID似乎是可靠的唯一标识,因此除非您针对旧版本,否则您没有动机使用这种技术。


类似这样的吗?http://www.java2s.com/Code/Android/Core-Class/getUniqueIDfromandroidproviderSettingsSecureANDROIDID.htm - Seraphim's
是的,就像那样 - 尽管使用一个常见且被广泛理解的哈希算法来合并结果会更好。 - Elemental
有任何具体的建议吗? :) - Seraphim's
1
谷歌为我找到了这个网址:http://www.javamex.com/tutorials/collections/hash_function_guidelines.shtml,看起来思路清晰,是一个很好的介绍。 - Elemental
2
从Android 6开始,由于安全原因,您不能使用getMacAddress()方法。它将仅返回一个常量值02:00:00:00:00:00。有关更多信息,请参见此问题:https://dev59.com/eVwX5IYBdhLWcg3w-Thv - lejonl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接