首先來講講常用的MAC IMEI UUID 這3個值 很多人都會拿他來做唯一碼 也許以前是可行的 不過現(xiàn)在版本多了 情況比較復(fù)雜
MAC碼 情況比較多
1 受權(quán)限影響 你有可能拿不到
2 受wifi影響 mac碼會存在可能性變動 因機型 和版本有所區(qū)別
A 連接成功的Mac碼
B 無法鏈接wifi的MAC碼
C 未打開wifi下的MAC碼
3 高版本手機取不到的情況很多
總的來說 比較極端的情況下 一臺手機能有3個MAC碼 ,也嘗試過 強制打開wift的情況下獲取,既然狀態(tài)保持一致了 那取到的值應(yīng)該也是一致才對,但是后來發(fā)現(xiàn) 有鏈接到wifi的和只打開 不鏈接的 mac碼居然存在差異。
還有的情況是第一次取Mac碼由于其他客觀因素導(dǎo)致獲取不到,然后后幾次取到了,再與第一次數(shù)據(jù)匹配的時候就會對不上
更多的情況是由于網(wǎng)絡(luò)情況不一致,經(jīng)常取不到一樣的mac碼,作為唯一碼老是對不上這個比較頭疼
如果你非要用這個的話,我建議不是每次都獲取一遍,是程序只運行一次,保存下來 然后每次都取這個值對比例如寫成一個實體文件寫到手機里面,然后讀取這個文件值
下面寫上獲取方法
/**
* 這里有漏洞 wift不打開 部分機型獲取不到 換成一種 兼容度更好的方法了
*/
public String getMac() {
mac = "";
String str = "";
try {
Process pp = Runtime.getRuntime().exec(
"cat /sys/class/net/wlan0/address ");
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str; ) {
str = input.readLine();
if (str != null) {
mac = str.trim();// 去空格
SharedPreferencesUtil.putString(mContext, "mac", mac);
break;
} else {
if (SharedPreferencesUtil.getString(mContext, "mac", "").equals("")) {
toggleWiFi(this, true);
flag = true;
}
}
}
} catch (IOException ex) {
// 賦予默認值
mac = "";
//丟到緩存去 不過建議寫一個實體文件保存吧 不然APP被干掉了 你數(shù)據(jù)也就丟了
SharedPreferencesUtil.putString(mContext, "mac", mac);
ex.printStackTrace();
Log.e("LoginActivity", "" + ex);
}
return SharedPreferencesUtil.getString(mContext, "mac", "");
}
IMEI
這個多卡多待直接暴死了,一張卡一個IMEI碼,取不到的情況也存在有
萬一用戶換了卡估計又會換掉一個,但是實際上用戶用的還是同一臺手機,
所以說拿來當(dāng)唯一碼會比較頭疼
UUID
// 獲取手機的UUID
public String getPhoneSign() {
StringBuilder deviceId = new StringBuilder();
// 渠道標(biāo)志
deviceId.append("a");
try {
String uuid = getUUID();
if (!TextUtils.isEmpty(uuid)) {
deviceId.append("id");
deviceId.append(uuid);
return deviceId.toString();
}
} catch (Exception e) {
e.printStackTrace();
deviceId.append("id").append(getUUID());
}
return deviceId.toString();
}
也是表面上的唯一 取不到 復(fù)數(shù)幾個不一樣的情況很多
到了最后,發(fā)現(xiàn)各種取值都不固定 都不穩(wěn)定,要面對的是M多的手機機型從4.0到9.0的系統(tǒng)版本,一套方案解決所有問題比較困難,還有不能拿所有用戶去做嘗試,被投訴的很慘。
最終我的解決方案如下:
1 獲取手機型號,拼接一串隨機數(shù)字加上日期,得出一條隨機數(shù)字
2 生成一個固定地址的實體文件到手機里面,保存這一條隨機數(shù)字
3 每次都讀取這個固定的實體文件,來比對設(shè)備是否是唯一
優(yōu)點:
1 免除了一切不穩(wěn)定因素,因為是自己生成的一串?dāng)?shù)字
2 穩(wěn)定取值,因為都是有一個文件存儲的,每次都用方法來取值比對
3 會出現(xiàn)取的值不一樣的情況很多
缺點:
1 生成的這一串?dāng)?shù)字包含信息沒有 實際取設(shè)備值來的有意義
2 用戶如果把那個文件給刪除掉了,唯一碼也就沒了不過相比之下
概率并不是太高
建議:
頭鐵可以嘗試一下用各種方式取值吧,相信會有更加完善的處理方案