安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题

来源:互联网 发布:上瘾网络剧美拍 编辑:程序博客网 时间:2024/05/24 07:20

一,先说获取渠道名(这里以友盟为例)

 /*    * 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量    * */    public static String getSource() {        //获取渠道名        String channelName ="huxiu";        channelName = AnalyticsConfig.getChannel(APP.getInstance());//友盟提供的获取渠道名的方法。如果你是别的统计平台,可以百度对应的方法        LogUtil.e("qcl45111", channelName);        return channelName;    }

二,Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题

 /*    * 4.5.1新加用来生成安卓设备标识    * */    public static String getUUid() {        /*The Android ID        * 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。        * 并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。        * */        String m_szAndroidID = android.provider.Settings.Secure.getString(APP.getInstance().getContentResolver(),                android.provider.Settings.Secure.ANDROID_ID);        LogUtil.e("params451", "手机id: " + m_szAndroidID);        /*The IMEI: 仅仅只对Android手机有效:        * 采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。        * 作为手机来讲,IMEI是唯一的,它应该类似于 359881030314356(除非你有一个没有量产的手机(水货)        * 它可能有无效的IMEI,如:0000000000000)        * 安卓7.0如果用户禁止READ_PHONE_STATE权限,将会导致应用崩溃*/        //        TelephonyManager TelephonyMgr = (TelephonyManager) APP.getInstance().getSystemService(TELEPHONY_SERVICE);        //        String m_szImei = TelephonyMgr.getDeviceId();        //        LogUtil.e("params451", "手机IMEI: " + m_szImei);        /*        *Android系统2.3版本以上可以获取硬件Serial Number        * 优点:非手机设备也可以通过该接口获取ID。        * */        String serial = null;        try {            //API>=9 使用serial号            serial = android.os.Build.class.getField("SERIAL").get(null).toString();            //            return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();        } catch (Exception exception) {            serial = "serial"; // serial需要一个初始化,随便一个初始化        }        LogUtil.e("params451", "serial串号: " + serial);        /*        * 有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。        * 而你仍然想获得唯一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。        * 这样计算出来的ID不是唯一的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。        * 但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:        * */        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 digits        String m_szLongID = serial + m_szDevIDShort + m_szAndroidID;        //md5加密生成唯一uuid        MessageDigest m = null;        try {            m = MessageDigest.getInstance("MD5");        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        m.update(m_szLongID.getBytes(), 0, m_szLongID.length());        // get md5 bytes        byte p_md5Data[] = m.digest();        // create a hex string        String m_szUniqueID = new String();        for (int i = 0; i < p_md5Data.length; i++) {            int b = (0xFF & p_md5Data[i]);            // if it is a single digit, make sure it have 0 in front (proper padding)            if (b <= 0xF)                m_szUniqueID += "0";            // add number to string            m_szUniqueID += Integer.toHexString(b);        }   // hex string to uppercase        m_szUniqueID = m_szUniqueID.toUpperCase();        LogUtil.e("params451", "最终组合uuid: " + m_szUniqueID);        return m_szUniqueID;    }


0 0
原创粉丝点击