獲取Android手機MAC的一些方法

獲取Android手機MAC的一種實現方案,僅供參考,哈哈哈!是否還有其他更優的解決方法呢?

請注意,高版本在WiFi關閉時,獲取不到MAC
`
/**
* 獲取手機MAC;
* @param context
* @return
*/

public static String getWlanMac(Context context){

    String mac = getWlanMacWifiManager(context);
    if(mac == null){
        //從本地文件獲取
        mac = getWlanMacLocalAddress();
        if(mac == null){
            //從java網絡接口獲取
            mac = getWlanMacInterface();
            if(mac == null){
                //最後從緩存裏讀取
                mac = Pref.getString("wlan_mac_cached", context);
            }
        }
    }
    if(mac != null){
        //緩存mac值,防止後續獲取失敗;一般MAC不會改變
        Pref.saveString("wlan_mac_cached", mac, context);
    }

    return mac;


/**
 * 從WifiManager接口獲取手機MAC;
 * @param context
 * @return
 */
public static String getWlanMacWifiManager(Context context){

    Log.i("DeviceUtil","get mac by WifiManager...");

    String mac = null;
    WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
    boolean isWifiEnabled = wifiManager.isWifiEnabled();
    if(!isWifiEnabled){
        //6.0以上版本獲取需要等待授權,所以下面的讀取語句會執行失敗
        wifiManager.setWifiEnabled(true);
    }
    if (isWifiEnabled) {
        WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
        if (wifiInfo != null) {
            mac = wifiInfo.getMacAddress();
            if(CheckUtils.isMacRight(mac)){
                Log.i("DeviceUtil","mac = " + mac);
                return mac;
            }else{
                mac = null;
            }
        }
    }
    return mac;
}

/**
 * 從本地文件獲取手機MAC;
 * @param context
 * @return
 */

public static String getWlanMacLocalAddress(){
    Log.i("DeviceUtil","get mac by local address...");
    String mac = null;
    String path = "/sys/class/net/wlan0/address";
    File wlan0 = new File(path);
    if(wlan0.exists() && wlan0.isFile()){
        mac = execCmd("cat " + path);
        if (CheckUtils.isMacRight(mac)) {
            return mac;
        }else{
            mac = null;
        }
    }
    return mac;
}

private static String getWlanMacInterface() {

    Log.i("DeviceUtil","get mac by new interface..." );

    String mac = null;
    try {
        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());  
        for (NetworkInterface nif : all) {  
            if (!nif.getName().equalsIgnoreCase("wlan0")) {
                continue;
            }

            byte[] macBytes = nif.getHardwareAddress();  
            if (macBytes == null) {  
                return mac;  
            }  

            StringBuilder builder = new StringBuilder();  
            for (byte b : macBytes) {  
                builder.append(String.format("%02X:",b));  
            }  

            if (builder.length() > 0) {  
                builder.deleteCharAt(builder.length() - 1);  
            }
            mac = builder.toString();
            Log.i("DeviceUtil","mac = " + mac);
        }  
    } catch (Exception e) {
        e.printStackTrace();
    }

    return mac;  
} 

`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章