android 唯一碼生成攻略(wings6)

首先來講講常用的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 用戶如果把那個文件給刪除掉了,唯一碼也就沒了不過相比之下
  概率并不是太高

建議:

 頭鐵可以嘗試一下用各種方式取值吧,相信會有更加完善的處理方案
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容