我正在尝试为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();
}
答案 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本身。换句话说,在应用程序首次运行时生成哈希并永久存储它:)。