国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android如何獲取雙卡手機IMEI的方法示例

2019-10-21 21:38:21
字體:
供稿:網(wǎng)友

前言:

項目中有個統(tǒng)計付費廣告轉(zhuǎn)化率的需求,需要獲取用戶手機的IMEI。但是網(wǎng)上最常見的方法有坑,也就是TelephonyManager.getDeviceId(),這方法有可能獲取的是MEID或者空值。然后自己Google了下,發(fā)現(xiàn)搜出來的靠前的幾個答案都不能正確獲取到兩個IMEI值。然后看到TelephonyManager源碼中getDeviceId()方法的下一個方法就是getImei()方法,只不過被系統(tǒng)隱藏掉了。運用反射調(diào)用一下,的確能獲取兩個IMEI值,故在此分享一下~~

背景:

一般的獲取IMEI的代碼是這樣的

public static String getIMEI(Context context) {      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);      String imei = telephonyManager.getDeviceId();      return imei;  }

源碼中的注釋已經(jīng)說明了,這方法可能返回IMEI,也可能返回MEID。我用的華為返回的就是MEID。他還有個帶參數(shù)的方法getDeviceId(int slotId),這個slotId應該就是卡槽編號,可能也能獲取到雙卡手機的DeviceId,不過我沒嘗試,因為反正他返回的不一定是我想要的IMEI。

解決方法:

利用反射,把系統(tǒng)隱藏掉的getImei()調(diào)用出來。

/**   * @param slotId slotId為卡槽Id,它的值為 0、1;   * @return   */  public static String getIMEI(Context context, int slotId) {    try {      TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);      Method method = manager.getClass().getMethod("getImei", int.class);      String imei = (String) method.invoke(manager, slotId);      return imei;    } catch (Exception e) {      return "";    }  }

調(diào)用時,分別傳入0、1,就可以獲取到雙卡手機的IMEI了。

PS:獲取主卡的IMEI,IMSI,ICCI的方法

  /**   * Author: liuqiang   * Time: 2017-08-14 15:28   * Description:   * <p>   * IMEI 與你的手機是綁定關系 用于區(qū)別移動終端設備   * IMSI 與你的手機卡是綁定關系 用于區(qū)別移動用戶的有效信息 IMSI是用戶的標識。   * ICCID ICCID是卡的標識,由20位數(shù)字組成   * ICCID只是用來區(qū)別SIM卡,不作接入網(wǎng)絡的鑒權認證。而IMSI在接入網(wǎng)絡的時候,會到運營商的服務器中進行驗證。   * https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/TelephonyManager.java   */  @RequiresApi(api = Build.VERSION_CODES.O)  public void check(View view) {    TelephonyManager telephonyManager = (TelephonyManager) this        .getSystemService(TELEPHONY_SERVICE);// 取得相關系統(tǒng)服務    String simOperatorName = telephonyManager.getSimOperatorName();    String imei = telephonyManager.getDeviceId();    //取出 IMEI    String imeiAPI26 = telephonyManager.getImei();    //取出 IMEI 需要 api26以上    String tel = telephonyManager.getLine1Number();   //取出 MSISDN,很可能為空    String imsi = telephonyManager.getSubscriberId();   //取出 IMSI    String icc = telephonyManager.getSimSerialNumber(); //取出 ICCID    Log.d("Q_M", "運行商名字--" + simOperatorName);    Log.d("Q_M", "IMEI--" + imei);    Log.d("Q_M", "IMEI_API26--" + imeiAPI26);    Log.d("Q_M", "IMSI--" + imsi);    Log.d("Q_M", "ICCID--" + icc);  }

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 长海县| 海门市| 高邑县| 清苑县| 开封县| 邵阳县| 大城县| 永安市| 观塘区| 桂林市| 确山县| 诏安县| 长垣县| 栾城县| 江西省| 弥渡县| 淮南市| 枣阳市| 定州市| 金乡县| 桐柏县| 八宿县| 中超| 仙桃市| 托里县| 晋城| 丹寨县| 凤山县| 德江县| 济阳县| 漳平市| 米林县| 阳东县| 余江县| 白水县| 元氏县| 阿坝| 纳雍县| 虹口区| 鹤岗市| 金门县|