是否可以使用某些代码获取设备的 IP 地址?

请您参考如下方法:

这是我用来读取 IP 和 MAC 地址的帮助程序。实现是纯java的,但是我在getMACAddress()中有一个注释 block ,它可以从特殊的Linux(Android)文件中读取值。我仅在少数设备和模拟器上运行过此代码,但如果您发现奇怪的结果,请告诉我。

// AndroidManifest.xml permissions 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
 
// test functions 
Utils.getMACAddress("wlan0"); 
Utils.getMACAddress("eth0"); 
Utils.getIPAddress(true); // IPv4 
Utils.getIPAddress(false); // IPv6  

Utils.java

import java.io.*; 
import java.net.*; 
import java.util.*;    
//import org.apache.http.conn.util.InetAddressUtils; 
 
public class Utils { 
 
    /** 
     * Convert byte array to hex string 
     * @param bytes toConvert 
     * @return hexValue 
     */ 
    public static String bytesToHex(byte[] bytes) { 
        StringBuilder sbuf = new StringBuilder(); 
        for(int idx=0; idx < bytes.length; idx++) { 
            int intVal = bytes[idx] & 0xff; 
            if (intVal < 0x10) sbuf.append("0"); 
            sbuf.append(Integer.toHexString(intVal).toUpperCase()); 
        } 
        return sbuf.toString(); 
    } 
 
    /** 
     * Get utf8 byte array. 
     * @param str which to be converted 
     * @return  array of NULL if error was found 
     */ 
    public static byte[] getUTF8Bytes(String str) { 
        try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; } 
    } 
 
    /** 
     * Load UTF8withBOM or any ansi text file. 
     * @param filename which to be converted to string 
     * @return String value of File 
     * @throws java.io.IOException if error occurs 
     */ 
    public static String loadFileAsString(String filename) throws java.io.IOException { 
        final int BUFLEN=1024; 
        BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN); 
        try { 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN); 
            byte[] bytes = new byte[BUFLEN]; 
            boolean isUTF8=false; 
            int read,count=0;            
            while((read=is.read(bytes)) != -1) { 
                if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) { 
                    isUTF8=true; 
                    baos.write(bytes, 3, read-3); // drop UTF8 bom marker 
                } else { 
                    baos.write(bytes, 0, read); 
                } 
                count+=read; 
            } 
            return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray()); 
        } finally { 
            try{ is.close(); } catch(Exception ignored){}  
        } 
    } 
 
    /** 
     * Returns MAC address of the given interface name. 
     * @param interfaceName eth0, wlan0 or NULL=use first interface  
     * @return  mac address or empty string 
     */ 
    public static String getMACAddress(String interfaceName) { 
        try { 
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 
            for (NetworkInterface intf : interfaces) { 
                if (interfaceName != null) { 
                    if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; 
                } 
                byte[] mac = intf.getHardwareAddress(); 
                if (mac==null) return ""; 
                StringBuilder buf = new StringBuilder(); 
                for (byte aMac : mac) buf.append(String.format("%02X:",aMac));   
                if (buf.length()>0) buf.deleteCharAt(buf.length()-1); 
                return buf.toString(); 
            } 
        } catch (Exception ignored) { } // for now eat exceptions 
        return ""; 
        /*try { 
            // this is so Linux hack 
            return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim(); 
        } catch (IOException ex) { 
            return null; 
        }*/ 
    } 
 
    /** 
     * Get IP address from first non-localhost interface 
     * @param useIPv4   true=return ipv4, false=return ipv6 
     * @return  address or empty string 
     */ 
    public static String getIPAddress(boolean useIPv4) { 
        try { 
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 
            for (NetworkInterface intf : interfaces) { 
                List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); 
                for (InetAddress addr : addrs) { 
                    if (!addr.isLoopbackAddress()) { 
                        String sAddr = addr.getHostAddress(); 
                        //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
                        boolean isIPv4 = sAddr.indexOf(':')<0; 
 
                        if (useIPv4) { 
                            if (isIPv4)  
                                return sAddr; 
                        } else { 
                            if (!isIPv4) { 
                                int delim = sAddr.indexOf('%'); // drop ip6 zone suffix 
                                return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); 
                            } 
                        } 
                    } 
                } 
            } 
        } catch (Exception ignored) { } // for now eat exceptions 
        return ""; 
    } 
 
} 

Disclaimer: Ideas and example code to this Utils class came from several SO posts and Google. I have cleaned and merged all examples.


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!