EthernetManager Android 以太网静态IP设置

来源:互联网 发布:浙师大行知学院新生 编辑:程序博客网 时间:2024/06/10 01:23

关于以太网设置

由于公司的需求,需要在项目中加入设置以太网静态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.jarplatform.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

以太网需要使用的jar包下载

0 0
原创粉丝点击