Android 獲取手機IP地址的兩種方式及常見問題
阿新 • • 發佈:2019-02-15
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的地址的。