美文网首页
android imei获取

android imei获取

作者: lantern王 | 来源:发表于2020-07-22 18:57 被阅读0次

    随着android系统不断升级,android设备的imei号已经越来越难获取了。网上一些推荐会用meid、androidid来代替imei号。但是因为项目推广需要比对渠道那边回传imei号来确认新增。
    发现部分机型渠道(eg:快手)可以获取到而我们获取不到,导致无法确认新增。最终在TelephonyManager中找到getDeviceSoftwareVersion()方法。可以变相实现获取imei号(但也会有getDeviceSoftwareVersion获取不到的机型,不过验证渠道那边也获取不到了)。

    public static String getIMEI() {
    TelephonyManager telephonyManager = (TelephonyManager) BaseApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
    String imei = null;
    if (AndPermission.hasPermissions(BaseApplication.getAppContext(), Manifest.permission.READ_PHONE_STATE)) {
    try {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    imei = telephonyManager.getImei();
    if (!TextUtils.isEmpty(imei)) {
    return imei;
    } else {
    String softwareVersion = getDeviceSoftwareVersion();
    if (!TextUtils.isEmpty(softwareVersion) && softwareVersion.length() > 14) {
    String imeiHead = softwareVersion.substring(0, 14);
    imei = imeiHead + luhn(imeiHead);
    return imei;
    } else {
    return null;
    }
    }
    } else {
    return telephonyManager.getDeviceId();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    return imei;
    }

    /**
    * Luhn算法
    * 根据号码获取校验位
    *
    * @param cardNumber
    * @return
    */
    public static int luhn(String cardNumber) {
    int totalNumber = 0;
    for (int i = cardNumber.length() - 1; i >= 0; i -= 2) {
    int tmpNumber = calculate(Integer.parseInt(String.valueOf(cardNumber.charAt(i))) * 2);
    if (i == 0) {
    totalNumber += tmpNumber;
    } else {
    totalNumber += tmpNumber + Integer.parseInt(String.valueOf(cardNumber.charAt(i - 1)));
    }

        }
        if (totalNumber >= 0 && totalNumber < 9) {
            return (10 - totalNumber);
        } else {
            String str = String.valueOf(totalNumber);
            if (Integer.parseInt(String.valueOf(str.charAt(str.length() - 1))) == 0) {
                return 0;
            } else {
                return (10 - Integer.parseInt(String.valueOf(str.charAt(str.length() - 1))));
            }
        }
    
    }
    

    其实是因为getDeviceSoftwareVersion和getImei()拼接规则只有末位两个数不相同,而imei的末位数可以通过luhn算法获取,从而拼接成imei值(自测有效)。

    但是毕竟还是有部分机型获取不到imei,可以使用oaid来补充说明。

    如果是自己app内部做唯一标识的话可以用meid、androidid或deviceid来代替imei
    public static String getUniqueId() {
    TelephonyManager telephonyManager = (TelephonyManager) BaseApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
    if (AndPermission.hasPermissions(BaseApplication.getAppContext(), Manifest.permission.READ_PHONE_STATE)) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

                String imei = telephonyManager.getMeid();
                if (imei != null && !imei.isEmpty()) {
                    LogUtils.e("meid:" + imei);
                    return imei;
                } else {
                    String androidid = Settings.Secure.getString(BaseApplication.getAppContext().getContentResolver(), Settings.Secure.ANDROID_ID);
                    LogUtils.e("androidid:" + androidid);
                    return androidid;
                }
            } else {
                String imei = null;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                    imei = telephonyManager.getImei();
                }
                if (imei != null && !imei.isEmpty()) {
                    LogUtils.e("imei:" + imei);
                    return imei;
                } else {
                    String deviceId = telephonyManager.getDeviceId();
                    LogUtils.e("deviceId:" + deviceId);
                    return deviceId;
                }
            }
        } else return null;
    
    }
    

    相关文章

      网友评论

          本文标题:android imei获取

          本文链接:https://www.haomeiwen.com/subject/jxbtlktx.html