Android 系统在程序中设置以太网的DHCP 和静态IP

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33018731/article/details/70674971

最近项目上有需求要在项目中修改以太网的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代替了。



展开阅读全文

没有更多推荐了,返回首页