2

我正在尝试为 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();
}
4

3 回答 3

0

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

如果您预计每毫秒有数千次安装,这是行不通的。如果没有,那很好。

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

于 2012-07-18T09:25:34.440 回答
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));

-- 编辑2 --

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

-- 编辑3 --

这是谷歌自己提出的解决方案。换句话说,在应用程序首次运行时生成哈希并将其永久存储:)。

于 2012-07-27T13:39:35.023 回答
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;
}
于 2012-07-27T13:34:00.860 回答