Android 获取手机IP地址的两种方式及常见问题

1.使用WIFI

添加权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

代码:

    public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
             
            //获取wifi服务  
            WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
            //判断wifi是否开启  
            if (!wifiManager.isWifiEnabled()) {  
            wifiManager.setWifiEnabled(true);    
            }  
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();       
            int ipAddress = wifiInfo.getIpAddress();   
            String ip = intToIp(ipAddress);   
            EditText et = (EditText)findViewById(R.id.EditText01);  
            et.setText(ip);  
        }     
        private String intToIp(int i) {       
             
              return (i & 0xFF ) + "." +       
            ((i >> 8 ) & 0xFF) + "." +       
            ((i >> 16 ) & 0xFF) + "." +       
            ( i >> 24 & 0xFF) ;  
         }   

此方法是没有问题的,Android 高低版本都合适

2、使用GPRS

权限:

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

代码;

    public 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("WifiPreference IpAddress", ex.toString());  
            }  
            return null;  
        }  

这里就有问题了,4.0以上手机 该方法获取到的是 fe80::5268:aff:fe97:de69%wlan0 这么一堆,

得到的地址是Ipv6的地址,而不是Ipv4的地址

解决办法如下:

就是在内部加入一句话:

!inetAddress.isLinkLocalAddress()
修正后的代码如下:

//获取本地IP
     public static 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() && !inetAddress.isLinkLocalAddress()) {  
                                return inetAddress.getHostAddress().toString();  
                                }  
                           }  
                        }  
                    } catch (SocketException ex) {  
                        Log.e("WifiPreference IpAddress", ex.toString());  
                    }  
            
            
                 return null;  
    } 

经测试,按照上面的方法,在android 4.0以上是可以得到Ipv4的地址的。



猜你喜欢

转载自blog.csdn.net/chaozhung/article/details/51279680