Android 系统在程序中设置以太网的DHCP 和静态IP
2017-04-25 10:18
495 查看
最近项目上有需求要在项目中修改以太网的DHCP和静态IP,在网上看了很多这方便的Demo,发现都不够全面,正好我们公司有个自己集成的EthernetManager的android源码,在源码中,找到了如何修改以太网的DHCP和静态IP,在此分享出来,让后人少踩坑!
先说下使用权限问题:
<!-- 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
具体重新签名步骤:
1 创建一个目录
2 整理必须的文件:
密钥文件:进入build/target/product/security ,找到【platform.pk8】和【platform.x509.pem】系统默认使用的密钥。
signapk工具:进入build\tools\signapk找到SignApk.java,运行 javac或者直接mm编译。
signapk.jar的源码位置build/tools/signapk,编译以后生成的文件路径:out/host/linux-x86/framework/signapk.jar
3.执行命令: java -jar signapk.jar platform.x509.pem platform.pk8 your.apk your_signed.apk
这条命令的意义是:通过signapk.jar这个可执行jar包,以“platform.x509.pem”这个公钥文件和“platform.pk8”这个私钥文件对“your.apk”进行签名,签名后的文件保存为“your_signed.apk”。
对于此处所使用的私钥和公钥的生成方式,这里就不做进一步介绍了。可以参考 http://blog.csdn.net/absurd/article/details/5002763(我是直接从源码中找到的,若有需要,请加我QQ 786914253获取)
接下来就是将源码中的classes.jar放入项目中获取隐藏API,至于如何获取和放入项目中,请参考这篇文章:http://blog.csdn.net/hudashi/article/details/8184442(我选的是方式二)
这样就可以获得EthernetManager类了,记得一定要将classes.jar置顶,要不然接下来的代码会报错.
以下就是设置DHCP和静态IP代码:
mEthManager = (EthernetManager) getSystemService(Context.ETHERNET_SERVICE);
if (isFuck) {
//DHCP模式
mIpAssignment=IpAssignment.DHCP;
mEthManager.setConfiguration(new IpConfiguration(mIpAssignment,
ProxySettings.NONE, null, null));
} else {
//STATIC模式
mIpAssignment=IpAssignment.STATIC;
mStaticIpConfiguration = new StaticIpConfiguration();
int result = validateIpConfigFields(mStaticIpConfiguration);
if (result != 0) {
Toast.makeText(this, " error id is " + result,
Toast.LENGTH_LONG).show();
return;
} else {
Toast.makeText(this, " success id is " + result,
Toast.LENGTH_LONG).show();
mEthManager.setConfiguration(new IpConfiguration(mIpAssignment,
ProxySettings.NONE, mStaticIpConfiguration, null));
}
}
其中 validateIpConfigFields方法如下:
private int validateIpConfigFields(StaticIpConfiguration staticIpConfiguration) {
String ipAddr = "192.168.1.123";
Inet4Address inetAddr = getIPv4Address(ipAddr);
if (inetAddr == null) {
return 2;
}
/*
String netmask = mMask.getText().toString();
if (TextUtils.isEmpty(netmask))
return 11;
Inet4Address netmas = getIPv4Address(netmask);
if (netmas == null) {
return 12;
}
int nmask = NetworkUtils.inetAddressToInt(netmas);
int prefixlength = NetworkUtils.netmaskIntToPrefixLength(nmask);
*/
int networkPrefixLength = -1;
try {
networkPrefixLength = Integer.parseInt("24");
if (networkPrefixLength < 0 || networkPrefixLength > 32) {
return 3;
}
staticIpConfiguration.ipAddress = new LinkAddress(inetAddr, networkPrefixLength);
} catch (NumberFormatException e) {
// Set the hint as default after user types in ip address
}
String gateway = "192.168.1.1";
InetAddress gatewayAddr = getIPv4Address(gateway);
if (gatewayAddr == null) {
return 4;
}
staticIpConfiguration.gateway = gatewayAddr;
String dns = "192.168.1.1";
InetAddress dnsAddr = null;
dnsAddr = getIPv4Address(dns);
if (dnsAddr == null) {
return 5;
}
staticIpConfiguration.dnsServers.add(dnsAddr);
return 0;
}
判断输入的IP地址是否符合规范:
private boolean isIpAddress(String value) {
int start = 0;
int end = value.indexOf('.');
int numBlocks = 0;
while (start < value.length()) {
if (end == -1) {
end = value.length();
}
try {
int block = Integer.parseInt(value.substring(start, end));
if ((block > 255) || (block < 0)) {
return false;
}
} catch (NumberFormatException e) {
return false;
}
numBlocks++;
start = end + 1;
end = value.indexOf('.', start);
}
return numBlocks == 4;
}
private Inet4Address getIPv4Address(String text) {
try {
return (Inet4Address) NetworkUtils.numericToInetAddress(text);
} catch (Exception e) {
return null;
}
}
其中需要设置IP,DNS等的地方我直接用string代替了。
先说下使用权限问题:
<!-- 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
具体重新签名步骤:
1 创建一个目录
2 整理必须的文件:
密钥文件:进入build/target/product/security ,找到【platform.pk8】和【platform.x509.pem】系统默认使用的密钥。
signapk工具:进入build\tools\signapk找到SignApk.java,运行 javac或者直接mm编译。
signapk.jar的源码位置build/tools/signapk,编译以后生成的文件路径:out/host/linux-x86/framework/signapk.jar
3.执行命令: java -jar signapk.jar platform.x509.pem platform.pk8 your.apk your_signed.apk
这条命令的意义是:通过signapk.jar这个可执行jar包,以“platform.x509.pem”这个公钥文件和“platform.pk8”这个私钥文件对“your.apk”进行签名,签名后的文件保存为“your_signed.apk”。
对于此处所使用的私钥和公钥的生成方式,这里就不做进一步介绍了。可以参考 http://blog.csdn.net/absurd/article/details/5002763(我是直接从源码中找到的,若有需要,请加我QQ 786914253获取)
接下来就是将源码中的classes.jar放入项目中获取隐藏API,至于如何获取和放入项目中,请参考这篇文章:http://blog.csdn.net/hudashi/article/details/8184442(我选的是方式二)
这样就可以获得EthernetManager类了,记得一定要将classes.jar置顶,要不然接下来的代码会报错.
以下就是设置DHCP和静态IP代码:
mEthManager = (EthernetManager) getSystemService(Context.ETHERNET_SERVICE);
if (isFuck) {
//DHCP模式
mIpAssignment=IpAssignment.DHCP;
mEthManager.setConfiguration(new IpConfiguration(mIpAssignment,
ProxySettings.NONE, null, null));
} else {
//STATIC模式
mIpAssignment=IpAssignment.STATIC;
mStaticIpConfiguration = new StaticIpConfiguration();
int result = validateIpConfigFields(mStaticIpConfiguration);
if (result != 0) {
Toast.makeText(this, " error id is " + result,
Toast.LENGTH_LONG).show();
return;
} else {
Toast.makeText(this, " success id is " + result,
Toast.LENGTH_LONG).show();
mEthManager.setConfiguration(new IpConfiguration(mIpAssignment,
ProxySettings.NONE, mStaticIpConfiguration, null));
}
}
其中 validateIpConfigFields方法如下:
private int validateIpConfigFields(StaticIpConfiguration staticIpConfiguration) {
String ipAddr = "192.168.1.123";
Inet4Address inetAddr = getIPv4Address(ipAddr);
if (inetAddr == null) {
return 2;
}
/*
String netmask = mMask.getText().toString();
if (TextUtils.isEmpty(netmask))
return 11;
Inet4Address netmas = getIPv4Address(netmask);
if (netmas == null) {
return 12;
}
int nmask = NetworkUtils.inetAddressToInt(netmas);
int prefixlength = NetworkUtils.netmaskIntToPrefixLength(nmask);
*/
int networkPrefixLength = -1;
try {
networkPrefixLength = Integer.parseInt("24");
if (networkPrefixLength < 0 || networkPrefixLength > 32) {
return 3;
}
staticIpConfiguration.ipAddress = new LinkAddress(inetAddr, networkPrefixLength);
} catch (NumberFormatException e) {
// Set the hint as default after user types in ip address
}
String gateway = "192.168.1.1";
InetAddress gatewayAddr = getIPv4Address(gateway);
if (gatewayAddr == null) {
return 4;
}
staticIpConfiguration.gateway = gatewayAddr;
String dns = "192.168.1.1";
InetAddress dnsAddr = null;
dnsAddr = getIPv4Address(dns);
if (dnsAddr == null) {
return 5;
}
staticIpConfiguration.dnsServers.add(dnsAddr);
return 0;
}
判断输入的IP地址是否符合规范:
private boolean isIpAddress(String value) {
int start = 0;
int end = value.indexOf('.');
int numBlocks = 0;
while (start < value.length()) {
if (end == -1) {
end = value.length();
}
try {
int block = Integer.parseInt(value.substring(start, end));
if ((block > 255) || (block < 0)) {
return false;
}
} catch (NumberFormatException e) {
return false;
}
numBlocks++;
start = end + 1;
end = value.indexOf('.', start);
}
return numBlocks == 4;
}
private Inet4Address getIPv4Address(String text) {
try {
return (Inet4Address) NetworkUtils.numericToInetAddress(text);
} catch (Exception e) {
return null;
}
}
其中需要设置IP,DNS等的地方我直接用string代替了。
相关文章推荐
- Android 7.0 增加以太网设置DHCP和静态IP
- Android 7.0 增加以太网设置DHCP和静态IP
- Android 6.0 修改以太网的ip 掩码 网关 DNS及DHCP和静态切换
- android 4.0 系统设置dhcp获取ip增加option60 选项
- Android判断Wifi高级设置是静态IP配置方式还是DHCP配置方式
- EthernetManager Android 以太网静态IP设置
- Android 以太网Ethernet DHCP和静态设置实现
- 如何在程序中设置 Android 的 IP、DNS 和网关?
- android设置以太网ip
- Ubuntu Linux系统下设置静态IP的方法
- CentOS系统安装完毕后,网络连接方式为NAT,系统无法上网或IP设置成静态后无法上
- Linux 系统设置静态 IP
- 设置静态IP,加快系统启动
- 1 weekend110的Linux带图形系统安装 + 网络配置 + 静态IP设置
- android程序开发-如何让程序的字体不随系统字体的设置而改变
- 通过程序打开Android常用系统设置界面
- linux系统设置静态IP 查看网卡配置文件
- 给Centos系统设置静态IP
- linux 静态IP设置 DHCP自动获取IP
- android系统启动时IP设置