AndroidUtil 手機(jī)信息工具類

前言:據(jù)項(xiàng)目需求,整理了一個(gè)AndroidUtil工具類,可獲取手機(jī)信息 & MAC地址 & 開機(jī)時(shí)間 & ip地址 &手機(jī)的imei、imsi等號(hào)碼。

/**
 * @desc 手機(jī)信息 & MAC地址 & 開機(jī)時(shí)間 & ip地址 &手機(jī)的imei叫乌、imsi等號(hào)碼
 * @auth 方毅超
 * @time 2017/10/24 11:27
 */

public class AndroidUtil {
    /**
     * MAC地址
     *
     * @return
     */
    public static String getMacAddress() {
 /*獲取mac地址有一點(diǎn)需要注意的就是android 6.0版本后,以下注釋方法不再適用徽缚,
 不管任何手機(jī)都會(huì)返回"02:00:00:00:00:00"這個(gè)默認(rèn)的mac地址憨奸,
 這是googel官方為了加強(qiáng)權(quán)限管理而禁用了getSYstemService(Context.WIFI_SERVICE)方法來獲得mac地址。*/
        //        String macAddress= "";
//        WifiManager wifiManager = (WifiManager) MyApp.getContext().getSystemService(Context.WIFI_SERVICE);
//        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//        macAddress = wifiInfo.getMacAddress();
//        return macAddress;

        String macAddress = null;
        StringBuffer buf = new StringBuffer();
        NetworkInterface networkInterface = null;
        try {
            networkInterface = NetworkInterface.getByName("eth1");
            if (networkInterface == null) {
                networkInterface = NetworkInterface.getByName("wlan0");
            }
            if (networkInterface == null) {
                return "02:00:00:00:00:02";
            }
            byte[] addr = networkInterface.getHardwareAddress();
            for (byte b : addr) {
                buf.append(String.format("%02X:", b));
            }
            if (buf.length() > 0) {
                buf.deleteCharAt(buf.length() - 1);
            }
            macAddress = buf.toString();
        } catch (SocketException e) {
            e.printStackTrace();
            return "02:00:00:00:00:02";
        }
        return macAddress;
    }

    /**
     * 獲得IP地址凿试,分為兩種情況排宰,一是wifi下,二是移動(dòng)網(wǎng)絡(luò)下红省,得到的ip地址是不一樣的
     * <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     */
    public static String getIPAddress(Context context) {
        NetworkInfo info = ((ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//當(dāng)前使用2G/3G/4G網(wǎng)絡(luò)
                try {
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                return inetAddress.getHostAddress();
                            }
                        }
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }

            } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//當(dāng)前使用無線網(wǎng)絡(luò)
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                //調(diào)用方法將int轉(zhuǎn)換為地址字符串
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
            }
        } else {
            //當(dāng)前無網(wǎng)絡(luò)連接,請(qǐng)?jiān)谠O(shè)置中打開網(wǎng)絡(luò)
        }
        return null;
    }

    /**
     * 將得到的int類型的IP轉(zhuǎn)換為String類型
     *
     * @param ip
     * @return
     */
    private static String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    }

    /**
     * 獲取 ANDROID_ID
     */
    public static String getAndroidId(Context context) {
        String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        return androidId;
    }

    /**
     * 獲取 開機(jī)時(shí)間
     */
    public static String getBootTimeString() {
        long ut = SystemClock.elapsedRealtime() / 1000;
        int h = (int) ((ut / 3600));
        int m = (int) ((ut / 60) % 60);
        return h + ":" + m;
    }

    /**
     * 手機(jī)信息
     * 需要 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     *
     * @return
     */
    public static String printSystemInfo() {
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = dateFormat.format(date);
        StringBuilder sb = new StringBuilder();
        sb.append("_______  系統(tǒng)信息  ").append(time).append(" ______________");
        sb.append("\nID                 :").append(Build.ID); // Either  a changelist number, or a label like "M4-rc20".
        sb.append("\nBRAND              :").append(Build.BRAND); //品牌名 如 Xiaomi
        sb.append("\nMODEL              :").append(Build.MODEL); //手機(jī)型號(hào)
        sb.append("\nRELEASE            :").append(Build.VERSION.RELEASE); //frimware版本(系統(tǒng)版本) 如:2.1-update1
        sb.append("\nSDK                :").append(Build.VERSION.SDK); //sdk版本號(hào)

        sb.append("\n_______ OTHER _______");
        sb.append("\nBOARD              :").append(Build.BOARD); //基板名 如 MSM8974
        sb.append("\nPRODUCT            :").append(Build.PRODUCT); //The name of the overall product.
        sb.append("\nDEVICE             :").append(Build.DEVICE); //品牌型號(hào)名额各,如小米4對(duì)應(yīng)cancro
        sb.append("\nFINGERPRINT        :").append(Build.FINGERPRINT); //包含制造商,設(shè)備名吧恃,系統(tǒng)版本等諸多信息 如  Xiaomi/cancro_wc_lte/cancro:6.0.1/MMB29M/V8.1.3.0.MXDCNDI:user/release-keys
        sb.append("\nHOST               :").append(Build.HOST); // 如 c3-miui-ota-bd43
        sb.append("\nTAGS               :").append(Build.TAGS); //Comma-separated tags describing the build, like "unsigned,debug".
        sb.append("\nTYPE               :").append(Build.TYPE); //The type of build, like "user" or "eng".
        sb.append("\nTIME               :").append(Build.TIME); //當(dāng)前時(shí)間虾啦,毫秒值
        sb.append("\nINCREMENTAL        :").append(Build.VERSION.INCREMENTAL);

        sb.append("\n_______ CUPCAKE-3 _______");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
            sb.append("\nDISPLAY            :").append(Build.DISPLAY); // 如 MMB29M
        }

        sb.append("\n_______ DONUT-4 _______");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.DONUT) {
            sb.append("\nSDK_INT            :").append(Build.VERSION.SDK_INT);
            sb.append("\nMANUFACTURER       :").append(Build.MANUFACTURER); // The manufacturer of the product/hardware. 如 Xiaomi
            sb.append("\nBOOTLOADER         :").append(Build.BOOTLOADER); //The system bootloader version number. 如
            sb.append("\nCPU_ABI            :").append(Build.CPU_ABI); // 如 armeabi-v7a
            sb.append("\nCPU_ABI2           :").append(Build.CPU_ABI2); // 如 armeabi
            sb.append("\nHARDWARE           :").append(Build.HARDWARE); // The name of the hardware (from the kernel command line or /proc). 如 qcom
            sb.append("\nUNKNOWN            :").append(Build.UNKNOWN); // Value used for when a build property is unknown.
            sb.append("\nCODENAME           :").append(Build.VERSION.CODENAME);
        }

        sb.append("\n_______ GINGERBREAD-9 _______");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            sb.append("\nSERIAL             :").append(Build.SERIAL); // A hardware serial number, if available. 如 abcdefgh
        }
        return sb.toString();
    }

    /**
     * 獲取手機(jī)的IMEI號(hào)碼
     * 使用TelephonyManager時(shí)需要 <uses-permission android:name="READ_PHONE_STATE" />
     */
    public static String getPhoneIMEI(Context context) {
        TelephonyManager mTm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String imei = mTm.getDeviceId();
        return imei;
    }
    /**
     * 獲取手機(jī)的imsi號(hào)碼
     * 使用TelephonyManager時(shí)需要 <uses-permission android:name="READ_PHONE_STATE" />
     */
    public static String getPhoneIMSI(Context context) {
        TelephonyManager mTm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String imsi = mTm.getSubscriberId();
        return imsi;
    }
    /**
     * 獲取手機(jī)號(hào)碼
     * 使用TelephonyManager時(shí)需要 <uses-permission android:name="READ_PHONE_STATE" />
     */
    public static String getPhoneNumer(Context context) {
        TelephonyManager mTm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String numer = mTm.getLine1Number(); // 手機(jī)號(hào)碼,有的可得,有的不可得
        return numer;
    }
    
}


    
   //# [Android下獲取設(shè)備唯一標(biāo)識(shí)(UDID, DeviceID...)](https://www.cnblogs.com/Nbox1989/p/4346347.html)

    protected static final String PREFS_FILE = "qy_gank_device_id.xml";
    protected static final String PREFS_DEVICE_ID = "qy_gank_device_id";
    protected static String uuid;

    static public String getUDID(Context s_instance) {
        if (uuid == null) {
            synchronized (PhoneUtils.class) {
                if (uuid == null) {
                    final SharedPreferences prefs = s_instance.getSharedPreferences(PREFS_FILE, 0);
                    final String id = prefs.getString(PREFS_DEVICE_ID, null);

                    if (id != null) {
                        // Use the ids previously computed and stored in the prefs file
                        uuid = id;
                    } else {

                        final String androidId = Settings.Secure.getString(s_instance.getContentResolver(), Settings.Secure.ANDROID_ID);

                        // Use the Android ID unless it's broken, in which case fallback on deviceId,
                        // unless it's not available, then fallback on a random number which we store
                        // to a prefs file
                        try {
                            if (!"9774d56d682e549c".equals(androidId)) {
                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")).toString();
                            } else {
                                final String deviceId = ((TelephonyManager) s_instance.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
                                uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString();
                            }
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }

                        // Write the value out to the prefs file
                        prefs.edit().putString(PREFS_DEVICE_ID, uuid).commit();
                    }
                }
            }
        }
        return uuid;
    }

后記:2017-10-30傲醉,將代碼稍作了整理蝇闭。
感謝:
Android 獲得設(shè)備狀態(tài)信息、Mac地址硬毕、IP地址
Android編程獲取手機(jī)型號(hào)呻引,本機(jī)電話號(hào)碼,sdk版本號(hào)及firmware版本號(hào)號(hào)(即系統(tǒng)版本號(hào)號(hào))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吐咳,一起剝皮案震驚了整個(gè)濱河市逻悠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌韭脊,老刑警劉巖童谒,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沪羔,居然都是意外死亡饥伊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蔫饰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琅豆,“玉大人,你說我怎么就攤上這事篓吁∶R颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵越除,是天一觀的道長节腐。 經(jīng)常有香客問我,道長摘盆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任饱苟,我火速辦了婚禮孩擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箱熬。我一直安慰自己类垦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布城须。 她就那樣靜靜地躺著蚤认,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糕伐。 梳的紋絲不亂的頭發(fā)上砰琢,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼陪汽。 笑死训唱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挚冤。 我是一名探鬼主播况增,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼训挡!你這毒婦竟也來了澳骤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤澜薄,失蹤者是張志新(化名)和其女友劉穎宴凉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體表悬,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弥锄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟆沫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽暇。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饭庞,靈堂內(nèi)的尸體忽然破棺而出戒悠,到底是詐尸還是另有隱情,我是刑警寧澤舟山,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布绸狐,位于F島的核電站,受9級(jí)特大地震影響累盗,放射性物質(zhì)發(fā)生泄漏寒矿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一若债、第九天 我趴在偏房一處隱蔽的房頂上張望符相。 院中可真熱鬧,春花似錦蠢琳、人聲如沸啊终。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓝牲。三九已至,卻和暖如春泰讽,著一層夾襖步出監(jiān)牢的瞬間例衍,已是汗流浹背昔期。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肄渗,地道東北人镇眷。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像翎嫡,于是被迫代替她去往敵國和親欠动。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容