1. 程式人生 > >android 獲取手機唯一標識(遇到的問題及處理)

android 獲取手機唯一標識(遇到的問題及處理)

我們專案中有一個需求,那就是獲取同一使用者進行簽到時候只能使用一個裝置,

在17年之前還可以正常使用,最近新增一個手機唯一標識許可權開啟管理,從而影響了最早之前的邏輯處理

在這裡專門做一個記錄,來警醒自己。

最早之前部落格 http://blog.csdn.net/u014007519/article/details/52526580

其中有一個程式碼獲取手機唯一標識 是需要獲取手機裝置資訊許可權的,但是有的使用者可能不開啟,有的使用者會選擇開啟,因為當時在sharedpreferences 左右快取,用起來也一直無事。最近過年做了一次強制升級,發現之前的問題暴露出來,那就是有許可權和無許可權獲取的唯一標識是不同的。之前的程式碼

if (EasyPermissions.hasPermissions(context, Manifest.permission.READ_PHONE_STATE)) { 
// 已經有攝像頭許可權了,可以使用該許可權完成app的相應的操作了 
Log.e(“執行請求”, “獲取true”); 
TelephonyManager telephonyManager = (TelephonyManager) context 
.getSystemService(Context.TELEPHONY_SERVICE); 
deviceId = telephonyManager.getDeviceId();// imei 


if (deviceId == null) { 
deviceId = telephonyManager.getSubscriberId();// imsi 

if (deviceId == null) { 
deviceId = telephonyManager.getSimSerialNumber(); 

if (deviceId == null) { 
deviceId = “noimei” + telephonyManager.getNetworkOperatorName(); 

}

國產手機的暴增,手機廠商的種類繁多,手機系統的私人定製,安卓系統的開源性,所以無論是deviceId ,wifi的mac地址,藍芽的mac地址,android系統id,等等 都無法準備保證唯一性。

後來又閱讀了許多文章,查詢相關的部落格,我尋到了最終方案,一個可以滿足中國最起碼95%的手機機型。

這就是初級版本程式碼: 對沒錯,無論手機,或者安卓裝置,可以使用

String serial_id=Build.SERIAL;

後來在查詢的過程發現一個高階版本,現在吧程式碼貼出來 ,因為程式碼也是轉載別人的,希望不涉及到侵權。 

public static String getUniquePsuedoID() {
    String serial = null;  // 35是IMEI開頭的號
String m_szDevIDShort = "35" + 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 位
try {
        serial = android.os.Build.class.getField("SERIAL").get(null).toString();
// API>=9 使用serial號
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
        // serial需要一個初始化       serial = "serial"; // 隨便一個初始化
}
    // 使用硬體資訊拼湊出來的15位號碼
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}