安卓獲取渠道名渠道id Android獲取裝置唯一標識的終極解決方法,防止安卓7.0時崩潰問題
阿新 • • 發佈:2018-12-30
一,先說獲取渠道名(這裡以友盟為例)
/* * 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; }