android_lottery_wifi_ethernet局部修改

来源:互联网 发布:php 记录日志 编辑:程序博客网 时间:2024/05/22 07:59

1、 getNetworkParameters 能获取wifi的静态IP值?还是所有IP信息,包括IP、网关……?

答:所有IP信息,包括IP、网关……

存在的问题:


2、问题描述:这是设置的IP信息

 

 getNetworkParamete发现dns2的值到dns1上了,是错开的!并且dns2没有设置成功和实现。

3、造成的原因是:


4、分析:

首先:从下面看getNetworkParameters()方法中的代码看似没问题。


getNetworkParameters里面WiFi部分代码,我看着,没啥问题啊,难道是set里面有问题?

发现造成 dns2的值改变了dns1的值,是由“造成原因”引起的。

5、修改步骤:

5.1 将public boolean wifiSetStaticIp(int mode, Intent intent){}方法中的



注释掉就行了,set  dns1后   get 的就是dns1


出现昨天的问题,我感觉是因为设置dns1,保存后,再设置dns2就把dns1所存在的地方给修改了,但是不知道为什么设置dns1的方法,不能用到设置dns2上呐


 这都是设置的dns1,再调用一遍,应该就是修改系统里面的dns1位置上的值!



 从结果看 是这样。

5.2注意查下Android系统手机(不要看成苹果IOS),是不是wifi的dns只有一个,不存在dns1和dns2的说法。如果只有一个dns,那也能解释dns2设置了,也是设置的dns1,也就是说两次设置dns都是对应一个
dns

查看手机发现:


 如果设置了可以正常上网, 那就应该可以设置两个dns?答:能正常上网。

6、最终解决代码如下:

 public boolean wifiSetStaticIp(int mode, Intent intent){}中放开dns2的注释



 然后在 private static void setDNS(InetAddress dns,WifiConfiguration wifiConf)}中




就行了,Dns1,Dns2就没问题了!

注意在写if ( mDnses.size() == 2) {
        mDnses.clear();
        }
是不对的,因为,程序第一次调用该该代码时,mDnses中没有内容,mDnses为null;所以mDnses.size()一开始会出错,造成修改WiFi静态setNetworkMode()返回FALSE。

并且修改静态IP失败。


完整代码如下:
public boolean wifiSetStaticIp(int mode, Intent intent){boolean res = false;WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);WifiConfiguration wifiConfig = null;WifiInfo connectionInfo = wifiManager.getConnectionInfo(); //得到连接的wifi网络List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();for (WifiConfiguration conf : configuredNetworks) {if (conf.networkId == connectionInfo.getNetworkId()) {wifiConfig = conf;Log.i(TAG,""+connectionInfo.getIpAddress());break;}}if (mode < 0 || mode > 2)return res;try {Log.e(TAG, "wifiSetStaticIp entry  ");setIpAssignment("STATIC", wifiConfig);// 设置wifi为静态ip分配方式setIpAddress(InetAddress.getByName(intent.getStringExtra("ip")), 24, wifiConfig);//192.168.191.2//Constructor<?> linkAddressConstructor = LinkAddress.class.getDeclaredConstructor(String.class);  //LinkAddress linkAddress = (LinkAddress) linkAddressConstructor.newInstance(intent.getStringExtra("ip"));//setMask(InetAddress.getByName(intent.getStringExtra("mask")),wifiConfig);setGateway(InetAddress.getByName(intent.getStringExtra("gateway")), wifiConfig);  setDNS(InetAddress.getByName(intent.getStringExtra("dns1")), wifiConfig);  setDNS(InetAddress.getByName(intent.getStringExtra("dns2")), wifiConfig); //没起作用wifiManager.updateNetwork(wifiConfig); // apply the settingtry {Runtime.getRuntime().exec("xbsu -c netcfg wlan0 down");Runtime.getRuntime().exec("xbsu -c netcfg wlan0 up");//可用netcfg看一下Log.i(TAG,"static ip up");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}return true;}catch(Exception e) {e.printStackTrace();return false;}}        

 //设置域名解析服务器      private static void setDNS(InetAddress dns,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,NoSuchFieldException,IllegalAccessException{          Object linkProperties=getField(wifiConf,"linkProperties");                  if(linkProperties==null)          {              return;          }                 ArrayList<InetAddress> mDnses=(ArrayList<InetAddress>)getDeclaredField(linkProperties,"mDnses");  ;                     //清除原有Dns设置(如果只想增加,不想清除,此句可省略)         // mDnses.clear();        //增加新的DNS        if (mDnses != null && mDnses.size() == 2) {        mDnses.clear();        }        mDnses.add(dns);    }  



7、收获:

这里是用了一种反射机制。然后,第一个setDns()调用时,setDns方法中ArrayList 变量mDnse  和第二次调用setDns()时,setDns方法中 的ArrayList mDnses是同一个变量。
这个跟   new 不一样。要是new的话,两次调用setDns方法会生成不同的mDns。
改成:

就可以,两次setDns()后,mDnses中有两个元素了,等第三次SetDns后,判断size为2,就会把mDnses中的清空,重新放dns1和dns2

反正改成后来的那样!!就可以控制到size为2,每2一循环。

永远是放在前两个位置。

8、总结

遗留问题如下:


0 0
原创粉丝点击