繁体   English   中英

从java中的android获取ip地址我遇到了一些错误

[英]get ip address from android in java i got some error

我试图在android中获取ip地址,但结果是这样的! 我想获取我的wifi范围的IP地址! 我怎样才能做到这一点 ?

 private String getLocalIpAddress() {
    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())
                {

                    return inetAddress.getHostAddress().toString();

                }
            }
        }
    } catch (SocketException ex) {
        Log.e("ServerActivity", ex.toString());
    }
    return null;
}

结果是这样的:fe80 :: 38aa:3cff:feb3:1cef%p2p0我也在android mainfast中添加了权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我用这个

try{
            WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
            int ipAddress = wm.getDhcpInfo().ipAddress;
            byte[] ipAddressbyte = BigInteger.valueOf(ipAddress).toByteArray();
            for(int i = 0; i < ipAddressbyte.length / 2; i++){
                int temp = ipAddressbyte[i];
                ipAddressbyte[i] = ipAddressbyte[ipAddressbyte.length - i - 1];
                ipAddressbyte[ipAddressbyte.length - i - 1] = (byte) temp;

            }

            InetAddress myaddr = InetAddress.getByAddress(ipAddressbyte);
            String hostaddr = myaddr.getHostAddress(); // numeric representation (such as "127.0.0.1")
            Log.d("INET",hostaddr);
        }catch (Exception e){
            Log.d("Exception",e.getMessage());
        }
Here You Will get All Details of Your Device !!!  

    //Main Classs 

         package com.example.devicedetail;

                import android.annotation.SuppressLint;
            import android.app.Activity;
            import android.content.Context;
            import android.os.Bundle;
            import android.telephony.TelephonyManager;
            import android.view.Menu;

            public class Device extends Activity {
            @SuppressLint("NewApi")
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_device);

                    String debug2 = System.getProperty("os.version");
                    String debug3 = android.os.Build.VERSION.RELEASE;
                    String debug4 = android.os.Build.DEVICE;
                    String debug5 = android.os.Build.MODEL;
                    String debug6 = android.os.Build.PRODUCT;
                    String debug7 = android.os.Build.BRAND;
                    String debug8 = android.os.Build.DISPLAY;
                    String debug9 = android.os.Build.CPU_ABI;
                    String debug10 = android.os.Build.CPU_ABI2;
                    String debug11 = android.os.Build.UNKNOWN;
                    String debug12 = android.os.Build.HARDWARE;
                    String debug13 = android.os.Build.ID;
                    String debug14 = android.os.Build.MANUFACTURER;
                    String debug15 = android.os.Build.SERIAL;
                    String debug16 = android.os.Build.USER;
                    String debug17 = android.os.Build.HOST;

                    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                    String imei = telephonyManager.getDeviceId();
                    String macwlan = Utils.getMACAddress("wlan0");
                    String macethr = Utils.getMACAddress("eth0");
                    String ip4 = Utils.getIPAddress(true); // IPv4
                    String ip36 = Utils.getIPAddress(true); // IPv6

                }

                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    // Inflate the menu; this adds items to the action bar if it is present.
                    getMenuInflater().inflate(R.menu.activity_device, menu);
                    return true;
                }

            }



    ----------




        //Util Class

        package com.example.devicedetail;

        import android.annotation.SuppressLint;
        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
             * @return
             */
            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
             * @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
             * @return  
             * @throws java.io.IOException
             */
            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 ex){} 
                }
            }

            /**
             * Returns MAC address of the given interface name.
             * @param interfaceName eth0, wlan0 or NULL=use first interface 
             * @return  mac address or empty string
             */
            @SuppressLint("NewApi")
            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 (int idx=0; idx<mac.length; idx++)
                            buf.append(String.format("%02X:", mac[idx]));       
                        if (buf.length()>0) buf.deleteCharAt(buf.length()-1);
                        return buf.toString();
                    }
                } catch (Exception ex) { } // 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 ipv4  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().toUpperCase();
                                boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
                                if (useIPv4) {
                                    if (isIPv4) 
                                        return sAddr;
                                } else {
                                    if (!isIPv4) {
                                        int delim = sAddr.indexOf('%'); // drop ip6 port suffix
                                        return delim<0 ? sAddr : sAddr.substring(0, delim);
                                    }
                                }
                            }
                        }
                    }
                } catch (Exception ex) { } // for now eat exceptions
                return "";
            }

        }



    ----------



        //PerMissions

        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

答案没有问题。如果要以ipv4获取,则为ipv6地址。 您可以尝试关注

 inetAddress.getLocalHost().getHostAddress();

这就是我通过单击来更改设备IP的方式,您可能需要使其适应您的喜好。 仅本地IP,而不是外部IP。

<uses-permission android:name="android.permission.INTERNET" />

private Enumeration<NetworkInterface> networkInterfaces = null;
private Enumeration<InetAddress> networkAddresses = null;

...
    if(wb == this.ipDisplayButton)
    {
        try
        {
            while(true)
            {
                if(this.networkInterfaces == null)
                {
                    networkInterfaces = NetworkInterface.getNetworkInterfaces();
                }
                if(networkAddresses == null || !networkAddresses.hasMoreElements())
                {
                    if(networkInterfaces.hasMoreElements())
                    {
                        NetworkInterface networkInterface = networkInterfaces.nextElement();
                        networkAddresses = networkInterface.getInetAddresses();
                    }
                    else
                    {
                        networkInterfaces = null;
                    }
                }
                else
                {
                    if(networkAddresses.hasMoreElements())
                    {
                        String address = networkAddresses.nextElement().getHostAddress();
                        if(address.contains(".")) //IPv4
                        {
                            ipDisplay.setText("IP Address: " + address);
                        }
                        break;
                    }
                    else
                    {
                        networkAddresses = null;
                    }
                }
            }
        }
        catch(SocketException e)
        {
            e.printStackTrace();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM