针对Android设备优化的UniqueID

时间:2012-07-18 09:20:24

标签: java android

我正在尝试为Android手机和平板电脑生成一个唯一的ID。我发现了一个有趣的功能,但是我用全新的Galaxy tab 2它不起作用。这是我的功能:

public String generateId(TelephonyManager tm, ContentResolver resolver) {
    final String tmDevice, tmSerial, androidId;
    tmDevice  = "" + tm.getDeviceId();
    tmSerial  = "" + tm.getSimSerialNumber();
    androidId = "" + Secure.getString(resolver, Secure.ANDROID_ID);
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
    return deviceUuid.toString();
}

3 个答案:

答案 0 :(得分:0)

我只是使用手机的毫秒时间戳,将其转换为字符串并附加0到10000之间的随机数的十六进制表示(并在应用程序第一次运行时生成它+将其存储在共享的Prefs中)。 例如:1342603520897_1bf

如果您希望每毫秒安装数千个,这将无效。如果没有,那很好。

这个解决方案的缺点是它不会在整个安装过程中持久存在,但它确实会为您提供匿名ID,这可能是一个加号。

答案 1 :(得分:0)

好的,这是一个有效的解决方案。不像前一个那么优雅......但它确实有效。

public String generateId(TelephonyManager tm, WifiInfo wi, ContentResolver resolver) {
    String m_szImei = "";
    String m_szDevIDShort = "";
    String m_szAndroidID = "";
    String m_szSim = "";
    String uniqueId = "";
    //imei
    try {
        m_szImei = tm!=null ? tm.getDeviceId() : "";
    } catch(Exception e) {}
    //sim
    try {
        m_szSim = tm!=null && new Checker().isSim(tm) ? tm.getSimSerialNumber() : wi!=null ? wi.getMacAddress() : "";
    } catch(Exception e) {}
    //"fake" imei for tablets
    try {
        m_szDevIDShort = "35" + //we make this look like a valid IMEI
            Build.BOARD.length()%10+ Build.BRAND.length()%10 +
            Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
            Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
            Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
            Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
            Build.TAGS.length()%10 + Build.TYPE.length()%10 +
            Build.USER.length()%10 ; //13 digits
    } catch(Exception e) {}
    //android id (may be null)
    m_szAndroidID = Secure.getString(resolver, Secure.ANDROID_ID);
    //unique id
    try {
        uniqueId = SHA256.compute(m_szImei+m_szSim+m_szDevIDShort+m_szAndroidID);
    } catch (Exception e) {}
    return uniqueId;
}

答案 2 :(得分:0)

尝试:String secureId = Secure.ANDROID_ID; 更多:http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID

这是一个64位散列,分配给设备的生命周期(或出厂重置,新ROM等)。

- 编辑 -

// usage:
Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID));

- edit2 -

String id = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID));
if(id==null || id=="9774d56d682e549c") { // emulator id
    WifiManager wm = (WifiManager)Ctxt.getSystemService(Context.WIFI_SERVICE);
    id = wm.getConnectionInfo().getMacAddress();
}

- edit3 -

这是解决方案proposed by Google本身。换句话说,在应用程序首次运行时生成哈希并永久存储它:)。