首先吐槽一下,在网上找了很多方法,但是一进去就崩溃了,这里要记住一个教训,try catch抛出的异常信息要打印Log,事实证明是没有添加相应权限导致的闪退.
下面直接列出我验证OK的方法:
public static String getGPRSLocalIpAddress() {
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("zdd",ex.toString());
}
return null;
}
private static String formatIpAddress(int ipAdress) {
return (ipAdress & 0xFF ) + "." +
((ipAdress >> 8 ) & 0xFF) + "." +
((ipAdress >> 16 ) & 0xFF) + "." +
( ipAdress >> 24 & 0xFF) ;
}
上面是获取连接有线时的IP地址,需要添加此权限
<uses-permission android:name="android.permission.INTERNET" />
下面这个是获取连接WIFI时的IP地址.
public static String getWIFILocalIpAdress(Context mContext) {
//获取wifi服务
WifiManager wifiManager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
//判断wifi是否开启
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = formatIpAddress(ipAddress);
return ip;
}
需要以下权限:
<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>
然后是获取Mac地址:
private static String wifiTag = "wlan0";//有线标志
private static String localTag = "eth0";//无线标志
public static String getMacAddr() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase(localTag)) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:",b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
}
return "02:00:00:00:00:00";
}
在cmd中通过adb shell进入Android系统,ifconfig获取网关信息,例如下面这种形式:
这是只连接有线网络的情况,lo是本地回环,eth0表示有线连接信息,其中inet addr就是IP地址,HWaddr是MAC地址.
连接无线时会有wlan0,后面列出的信息格式相同.