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(); }