android 唯一碼生成建議
最終我的解決方案如下:
? ? 1 獲取手機(jī)型號(hào),拼接一串隨機(jī)數(shù)字加上日期,得出一條隨機(jī)數(shù)字
? ? 2 生成一個(gè)固定地址的實(shí)體文件到手機(jī)里面,保存這一條隨機(jī)數(shù)字
? ? 3 每次都讀取這個(gè)固定的實(shí)體文件,來(lái)比對(duì)設(shè)備是否是唯一
優(yōu)點(diǎn):免除了一切不穩(wěn)定因素,因?yàn)槭亲约荷傻囊淮當(dāng)?shù)字
? ? ? 穩(wěn)定取值,因?yàn)槎际怯幸粋€(gè)文件存儲(chǔ)的,每次都用方法來(lái)取值比對(duì)?會(huì)出現(xiàn)取的值不一樣的情況很多
缺點(diǎn):1 生成的這一串?dāng)?shù)字包含信息沒(méi)有 實(shí)際取設(shè)備值來(lái)的有意義
? ? ? 2 用戶如果把那個(gè)文件給刪除掉了,唯一碼也就沒(méi)了不過(guò)相比之下概率并不是太高
下面是我處理這個(gè)問(wèn)題的一些測(cè)試結(jié)果,僅供參考
首先來(lái)講講常用的MAC IMEI UUID? ?這3個(gè)值 很多人都會(huì)拿他來(lái)做唯一碼? 也許以前是可行的 不過(guò)現(xiàn)在版本多了 情況比較復(fù)雜
1 受權(quán)限影響 你有可能拿不到
2 受wifi影響 mac碼會(huì)存在可能性變動(dòng) 因機(jī)型 和版本有所區(qū)別
? ? ? ? ? ? ?A 連接成功的Mac碼
? ? ? ? ? ? ?B 無(wú)法鏈接wifi的MAC碼?
? ? ? ? ? ? ?C 未打開(kāi)wifi下的MAC碼?
3 高版本手機(jī)取不到的情況很多
? ? ? ? ? ? ? ? ? ??
總的來(lái)說(shuō) 比較極端的情況下 一臺(tái)手機(jī)能有3個(gè)MAC碼 ,也嘗試過(guò) 強(qiáng)制打開(kāi)wift的情況下獲取,既然狀態(tài)保持一致了 那取到的值
應(yīng)該也是一致才對(duì),但是后來(lái)發(fā)現(xiàn) 有鏈接到wifi的和只打開(kāi) 不鏈接的 mac碼居然存在差異。
還有的情況是第一次取Mac碼由于其他客觀因素導(dǎo)致獲取不到,然后后幾次取到了,再與第一次數(shù)據(jù)匹配的時(shí)候就會(huì)對(duì)不上
更多的情況是由于網(wǎng)絡(luò)情況不一致,經(jīng)常取不到一樣的mac碼,作為唯一碼老是對(duì)不上這個(gè)比較頭疼
如果你非要用這個(gè)的話,我建議不是每次都獲取一遍,是程序只運(yùn)行一次,保存下來(lái) 然后每次都取這個(gè)值對(duì)比
例如寫(xiě)成一個(gè)實(shí)體文件寫(xiě)到手機(jī)里面,然后讀取這個(gè)文件值
下面寫(xiě)上對(duì)應(yīng)的獲取方法
? ? /**
? ? ?* 這里有漏洞 wift不打開(kāi) 部分機(jī)型獲取不到? 換成一種 兼容度更好的方法了
? ? ?*/
? ?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) {
? ? ? ? ? ?// 賦予默認(rèn)值
? ? ? ? ? ?mac = "";
? ? ? ? ? ?//丟到緩存去? 不過(guò)建議寫(xiě)一個(gè)實(shí)體文件保存吧? 不然APP被干掉了 你數(shù)據(jù)也就丟了
? ? ? ? ? ?SharedPreferencesUtil.putString(mContext, "mac", mac);?
? ? ? ? ? ?ex.printStackTrace();
? ? ? ? ? ?Log.e("LoginActivity", "" + ex);
? ? ? ?}
? ? ? ?return SharedPreferencesUtil.getString(mContext, "mac", "");
? ?}
---------------------------------------------------------------------
IMEI
這個(gè)多卡多待直接暴死了,一張卡一個(gè)IMEI碼,取不到的情況也存在有
萬(wàn)一用戶換了卡估計(jì)又會(huì)換掉一個(gè),但是實(shí)際上用戶用的還是同一臺(tái)手機(jī),
所以說(shuō)拿來(lái)當(dāng)唯一碼會(huì)比較頭疼
-------------------------------------------------------------
UUID
//? 獲取手機(jī)的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ù)幾個(gè)不一樣的情況很多?
----------------------------------------------------
到了最后,發(fā)現(xiàn)各種取值都不固定 都不穩(wěn)定,要面對(duì)的是M多的手機(jī)機(jī)型
從4.0到9.0的系統(tǒng)版本,一套方案解決所有問(wèn)題比較困難,還有不能拿所有
用戶去做嘗試,被投訴的很慘。
建議: