1. 程式人生 > >Android 獲取手機IP地址的兩種方式及常見問題

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的地址的。