1. 程式人生 > >安卓獲取渠道名渠道id Android獲取裝置唯一標識的終極解決方法,防止安卓7.0時崩潰問題

安卓獲取渠道名渠道id Android獲取裝置唯一標識的終極解決方法,防止安卓7.0時崩潰問題

一,先說獲取渠道名(這裡以友盟為例)

 /*
    * 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;
    }