关于以太网设置
由于公司的需求,需要在项目中加入设置以太网静态IP的功能,在网上找了一下,发 现这方面的资料比较少最后只找到了一个demo,但是导入后发现项目报错.
之后查了一下资料才发现原来EthernetManager是谷歌隐藏的API,关于隐藏API的调用,可以去看下下面这篇文章:
如何调用Android隐藏API
废话不多说先上代码
// 监听以太网状态的广播,包括网线插拔和以太网开关
private IntentFilter mIntentFilter;
private final BroadcastReceiver mReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
// 当以太网状态改变
if (action.equals(EthernetDataTracker.ETHERNET_STATE_CHANGED_ACTION)){
// 取得当前以太网状态
int state = intent.getIntExtra(EthernetDataTracker.EXTRA_ETHERNET_STATE, 0);
// 根据当前以太网状态取得信息
switch (state) {
case EthernetDataTracker.ETHER_STATE_CONNECTED: //已连接
// Utils.showToast(context, "Ethernet以连接----"+isEthernet);
if (isEthernet) { //防止接收到广播后直接跳转了
pdb.dismiss();
isNetworkAvailable(context);
}
break;
case EthernetDataTracker.ETHER_STATE_DISCONNECTED: //未连接
// Utils.showToast(context, "Ethernet未连接");
// isEthernet = false;
break;
}
getEthInfo(state); //根据以太网状态取得以太网信息
}
}
};
上面的代码有些项目中自己封装的方法,不要太在意.以太网的状态主要分为静态IP,和动态IP的,下面的方法主要是根据不同的状态来获取以太网的信息的.
public void getEthInfo(int state){
if (state == EthernetDataTracker.ETHER_STATE_DISCONNECTED{
// 如果以太网未连接
} else{
ContentResolver contentResolver = context.getContentResolver();
// 是否使用静态IP
int useStaticIp = System.getInt(contentResolver,
System.ETHERNET_USE_STATIC_IP, 0);
if (useStaticIp == 1){ // 如果是静态的
// 取得静态IP
mEthIpAddress = System.getString(contentResolver,
System.ETHERNET_STATIC_IP);
// 取得静态子网掩码
mEthNetmask = System.getString(contentResolver,
System.ETHERNET_STATIC_NETMASK);
// 取得静态网关
mEthGateway = System.getString(contentResolver,
System.ETHERNET_STATIC_GATEWAY);
// 以下两种方式均可取得dns
// 取得dns1
mEthdns1 = System.getString(contentResolver,
System.ETHERNET_STATIC_DNS1);
// 取得dns2
mEthdns2 = System.getString(contentResolver,
System.ETHERNET_STATIC_DNS2);
} else{
String tempIpInfo;
String iface = mEthManager.getEthernetIfaceName();
// 取得动态IP地址
tempIpInfo = SystemProperties.get("dhcp." + iface + ".ipaddress");
if ((tempIpInfo != null) && (!tempIpInfo.equals(""))){
mEthIpAddress = tempIpInfo;
} else{
mEthIpAddress = "";
}
// 取得动态子网掩码
tempIpInfo = SystemProperties.get("dhcp." + iface + ".mask");
if ((tempIpInfo != null) && (!tempIpInfo.equals(""))){
mEthNetmask = tempIpInfo;
} else{
mEthNetmask = "";
}
// 取得动态网关
tempIpInfo = SystemProperties.get("dhcp." + iface + ".gateway");
if ((tempIpInfo != null) && (!tempIpInfo.equals(""))){
mEthGateway = tempIpInfo;
} else{
mEthGateway = "";
}
// 取得动态dns1
tempIpInfo = SystemProperties.get("dhcp." + iface + ".dns1");
if ((tempIpInfo != null) && (!tempIpInfo.equals(""))){
mEthdns1 = tempIpInfo;
} else{
mEthdns1 = "";
}
// 取得动态dns2
tempIpInfo = SystemProperties.get("dhcp." + iface + ".dns2");
if ((tempIpInfo != null) && (!tempIpInfo.equals(""))){
mEthdns2 = tempIpInfo;
} else{
mEthdns2 = "";
}
}
}
}
获取到信息之后接下来就是设置静态IP了
// 方便取出相关的信息,数组里索引从小打大对应的意思见名知意
private String[] mSettingNames = { System.ETHERNET_STATIC_IP,
System.ETHERNET_STATIC_GATEWAY, System.ETHERNET_STATIC_NETMASK,
System.ETHERNET_STATIC_DNS1, System.ETHERNET_STATIC_DNS2 };
/*
设置静态IP的方法,
*/
System.putString(contentResolver, mSettingNames[i], text);
// 保存 "是否使用静态 IP" 的配置
System.putInt(contentResolver, System.ETHERNET_USE_STATIC_IP, 1);
当然了这还不算完,有一点比较坑的地方就是,你必须要保证你输入的IP值是正确的IP格式,比如你要是输入个1或者其他不符合IP地址格式的值那么悲剧很可能就要发生了,你的系统很可能就会变砖了
下面附上有效IP地址的判断:
/**
* 返回 指定的 String 是否是 有效的 IP 地址.
*/
public static boolean isValidIpAddress(String value) {
int start = 0;
int end = value.indexOf('.');
int num = 0;
while (start < value.length()) {
if (-1 == end) {
end = value.length();
}
try {
int block = Integer.parseInt(value.substring(start, end));
if ((block > 255) || (block < 0)) {
return false;
}
} catch (NumberFormatException e) {
return false;
}
num++;
start = end + 1;
end = value.indexOf('.', start);
}
return num == 4;
}
注意:一定要判断是否是有效的IP地址,还有设置完IP地址后重启下以太网才会生效
mEthManager.setEthernetEnabled(true); // 开启以太网
最后说下权限问题
<!-- android:sharedUserId="android.uid.system" 使其成为系统应用-->
使用这个权限需要系统对应的三个文件:
signapk.jar
platform.x509.pem
platform.pk8
并在cmd中用以下命令签名
java -jar signapk.jar platform.x509.pem platform.pk8 pubwin_box_v1.1.apk pubwin_box_v1.1_signed.apk