Android - 如何解决 9774d56d682e549c 问题?Android ID

17

我以为很聪明地使用了Android的安全唯一ID的各种哈希和排列方式来识别我的用户...

但事实证明,9774d56d682e549c是由某些低版本的Android设备返回的一个特殊ID。

Secure.getString(getContentResolver(), Secure.ANDROID_ID);

对于许多设备来说......似乎我构建的每个模拟器都具有相同的ID,而许多其他人的手机(很多Moto Droid!)和刷过的操作系统修改 tend to返回此相同重复值。非MotoDroid /非刷机的手机似乎都会给我返回一个唯一的字符串。但是这个重复值在我的数据库中出现了大约60次!

我将优化我的应用程序以在注册之前检查该字符串,但处理它以获得另一个唯一值的推荐方法是什么?

我目前的想法是检查它,生成一个极大的随机值,进行散列处理,然后将其存储在SharedPreferences中,然后使用ANDROID_ID或存储在sharedprefs中的值(如果用户的手机提供该值)。是否有更好的想法,或者这个方案足够坚固以避免这个疯狂的bug?


1
另请参见https://dev59.com/mm445IYBdhLWcg3wkLFG以获取更多信息。 - Volker Stolz
4个回答

8
请查看识别应用程序安装文章。你不能依赖于ANDROID_ID。最好的解决方案是使用以下方式生成自定义id:
String id = UUID.randomUUID().toString();

谢谢提供链接。我稍微修改了一下代码以适应实现,现在它运行得很好。安卓的小问题! - Eric

2

如果您想创建与真实的ANDROID_ID格式相同的ID,可以使用他们在这里使用的方法:

private static String generateAndroidId() {
    String generated = null;
    try {
        final SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed( (System.nanoTime() + new SecureRandom().nextLong()).getBytes() );
        generated = Long.toHexString(random.nextLong());
    } catch (NoSuchAlgorithmException e) {
        Log.e(TAG, "Unexpected exception", e);
    }
    return generated;
}

输出结果:9e7859438099538e

1

虽然不是理想的方案,但像Google AdMob SDK这样的东西使用权限android.permission.READ_PHONE_STATE来读取设备的电话号码等信息。

以下博客文章中有一些有用的相关信息:http://strazzere.com/blog/?p=116


1

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