android获取ip地址两种方式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hunhun1122/article/details/72457971

1.使用WIFI

添加权限

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>    
  2. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>    
  3. <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>  

代码:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState) {    
  2.         super.onCreate(savedInstanceState);    
  3.         setContentView(R.layout.main);    
  4.            
  5.         //获取wifi服务    
  6.         WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);    
  7.         //判断wifi是否开启    
  8.         if (!wifiManager.isWifiEnabled()) {    
  9.         wifiManager.setWifiEnabled(true);      
  10.         }    
  11.         WifiInfo wifiInfo = wifiManager.getConnectionInfo();         
  12.         int ipAddress = wifiInfo.getIpAddress();     
  13.         String ip = intToIp(ipAddress);     
  14.         EditText et = (EditText)findViewById(R.id.EditText01);    
  15.         et.setText(ip);    
  16.     }       
  17.     private String intToIp(int i) {         
  18.            
  19.           return (i & 0xFF ) + "." +         
  20.         ((i >> 8 ) & 0xFF) + "." +         
  21.         ((i >> 16 ) & 0xFF) + "." +         
  22.         ( i >> 24 & 0xFF) ;    
  23.      }     

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

2、使用GPRS

权限:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>    

代码;

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public String getLocalIpAddress()    
  2.     {    
  3.         try    
  4.         {    
  5.             for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)    
  6.             {    
  7.                NetworkInterface intf = en.nextElement();    
  8.                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)    
  9.                {    
  10.                    InetAddress inetAddress = enumIpAddr.nextElement();    
  11.                    if (!inetAddress.isLoopbackAddress())    
  12.                    {    
  13.                        return inetAddress.getHostAddress().toString();    
  14.                    }    
  15.                }    
  16.            }    
  17.         }    
  18.         catch (SocketException ex)    
  19.         {    
  20.             Log.e("WifiPreference IpAddress", ex.toString());    
  21.         }    
  22.         return null;    
  23.     }    

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

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

解决办法如下:

就是在内部加入一句话:

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

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. //获取本地IP  
  2.      public static String getLocalIpAddress() {    
  3.             try {    
  4.                 for (Enumeration<NetworkInterface> en = NetworkInterface    
  5.                                 .getNetworkInterfaces(); en.hasMoreElements();) {    
  6.                             NetworkInterface intf = en.nextElement();    
  7.                            for (Enumeration<InetAddress> enumIpAddr = intf    
  8.                                     .getInetAddresses(); enumIpAddr.hasMoreElements();) {    
  9.                                 InetAddress inetAddress = enumIpAddr.nextElement();    
  10.                                 if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {    
  11.                                 return inetAddress.getHostAddress().toString();    
  12.                                 }    
  13.                            }    
  14.                         }    
  15.                     } catch (SocketException ex) {    
  16.                         Log.e("WifiPreference IpAddress", ex.toString());    
  17.                     }    
  18.               
  19.               
  20.                  return null;    
  21.     }   

经测试,按照上面的方法,在android 4.0以上是可以得到Ipv4的地址的。
展开阅读全文

没有更多推荐了,返回首页