手機到了10.0獲取getSubscriberId()會報錯,直接提示用戶沒有10187權限。然後看google文檔裏解釋如此:
在使用 Android 標識符時,請遵循以下最佳做法:
-
避免使用硬件標識符。 在大多數用例中,您可以避免使用硬件標識符,例如 SSAID (Android ID) 和 IMEI,而不會限制所需的功能。
自 Android 10(API 級別 29)起,您的應用必須是設備或個人資料所有者應用,具有特殊運營商許可,或具有
READ_PRIVILEGED_PHONE_STATE
特權,才能訪問不可重置的設備標識符。 -
只針對用戶分析或廣告用例使用廣告 ID。 在使用廣告 ID 時,請始終遵循用戶關於廣告跟蹤的選擇。此外,請確保標識符無法關聯到個人身份信息 (PII),並避免橋接廣告 ID 重置。
-
盡一切可能針對防欺詐支付和電話以外的所有其他用例使用實例 ID 或私密存儲的 GUID。 對於絕大多數非廣告用例,使用實例 ID 或 GUID 應該足矣。
-
使用適合您的用例的 API 以儘量降低隱私權風險。 使用 DRM API 保護重要內容,並使用 SafetyNet API 防止濫用行爲。SafetyNet API 是能夠確定設備真僞而不會招致隱私權風險的最簡單方法。
然後只能用Android_ID來替換,傳說Android_ID也是唯一的,但是MISI的460080100開頭的能看懂的人知道這個是啥東西(當然我不知道)
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //獲取Android_ID now_IMSI = Settings.System.getString(getContentResolver(), Settings.Secure.ANDROID_ID); } else { now_IMSI = tm.getSubscriberId();// 手機卡唯一標識,android 10.0獲取不到 }