無線網絡信息可以通過api直接獲取,無需特別處理,下面主要是機頂盒等android設備使用有線網絡時網絡信息的獲取。
1.網絡類型
/**
* 獲取網絡類型
* @return
* -1:未知網絡
* 0:無網絡
* 1:wifi網絡
* 2:移動網絡
* 3:以太網
*/
public static int getNetWorkInfo() {
ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
if (info.getType() == ConnectivityManager.TYPE_WIFI) {
return 1;
}
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
return 2;
}
if (info.getType() == ConnectivityManager.TYPE_ETHERNET) {
return 3;
}
} else {
return 0;
}
return -1;
}
2.獲取詳細網絡信息
static final String etName = "eth0";
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static NetWorkInfo getETnetwork(NetWorkInfo netWorkInfo) {
EthernetManager mEthernetManager = (EthernetManager) MyApplication.getContext().getSystemService("ethernet");
IpConfiguration configuration = mEthernetManager.getConfiguration();
if (configuration == null) {
return netWorkInfo;
}
IpConfiguration.IpAssignment ipAssignment = configuration.getIpAssignment();
if (ipAssignment == null) {
return netWorkInfo;
}
String ip = "";
String mask = "";
String gateway = "";
String dns1 = "";
String dns2 = "";
if (IpConfiguration.IpAssignment.DHCP == ipAssignment) {//DHCP自動分配方式
Log.i(TAG, "DHCP");
ip = getSystemOsString("dhcp." + etName + ".ipaddress");//ip
mask = getSystemOsString("dhcp." + etName + ".mask");
gateway = getSystemOsString("dhcp." + etName + ".gateway");
dns1 = getSystemOsString("dhcp." + etName + ".dns1");
dns2 = getSystemOsString("dhcp." + etName + ".dns2");
} else if (IpConfiguration.IpAssignment.STATIC == ipAssignment) {//手動設置方式
Log.i(TAG, "STATIC");
ip = configuration.getStaticIpConfiguration().ipAddress.getAddress().getHostAddress();
mask = getMask(configuration.getStaticIpConfiguration().ipAddress.getPrefixLength());
gateway = configuration.getStaticIpConfiguration().gateway.getHostAddress();
dns1 = configuration.getStaticIpConfiguration().dnsServers.get(0).getHostAddress();
dns2 = configuration.getStaticIpConfiguration().dnsServers.get(1).getHostAddress();
}
netWorkInfo.mask = mask;//子網掩碼
netWorkInfo.gateway = gateway;//網關
netWorkInfo.dns1 = dns1;//dns1
netWorkInfo.dns2 = dns2;//dns2
return netWorkInfo;
}
/**
* 計算子網掩碼
*/
private static String getMask(int prefix) {
StringBuilder stb = new StringBuilder();
StringBuilder result = new StringBuilder();
for (int i = 1; i <= 32; i++) {
stb.append(i <= prefix ? "1" : "0");
if (i % 8 == 0) {
result.append(Integer.parseInt(stb.toString(), 2)).append(".");
stb.setLength(0);
}
}
return result.deleteCharAt(result.length() - 1).toString();
}
private static String getSystemOsString(String property) {
Class clazz = null;
try {
clazz = Class.forName("android.os.SystemProperties");
} catch (ClassNotFoundException e) {
e.printStackTrace();
return unknown;
}
Method met;
try {
met = clazz.getMethod("get", String.class, String.class);
met.setAccessible(true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
return unknown;
}
Object obj = null;
try {
obj = met.invoke(null, new Object[]{property, "unknown"});
} catch (IllegalArgumentException e) {
e.printStackTrace();
return unknown;
} catch (IllegalAccessException e) {
e.printStackTrace();
return unknown;
} catch (InvocationTargetException e) {
e.printStackTrace();
return unknown;
}
return (String) obj;
}
關於子網掩碼的計算:
prefixLength最大32位,可以分成4組8個1的二進制,正好是255,255,255,255,少N位就要在末尾去掉N個1加上N個0,然後再把4組二進制數據換成十進制就得出最終結果;
例如:
30 = 255,255,255,252
26 = 255,255,255,192
最後,EthernetManager這個類是被隱藏的,可以自己把這一部分的android源碼加到自己的項目裏去調用,也可以用我上傳的jar包直接用。
android.net.jar