EthernetManager Android 以太网静态IP设置

关于以太网设置

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

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

要在RK3399 Android 10.0设备中设置静态IP,可以按照以下步骤操作: 1. 首先,在设备上找到并打开“设置”应用程序。 2. 在设置界面中,向下滚动直到找到“网络和互联网”选项,并点击进入。 3. 在网络和互联网菜单中,选择“以太网”选项。如果设备没有物理以太网接口,可能显示为“有线连接”或类似选项。 4. 进入以太网设置后,点击右上角的菜单按钮(通常是三个竖排的点或线),然后选择“高级”或“高级选项”。 5. 在高级设置中,寻找一个类似“IP设置”、“IP地址设置”或“连接类型”等选项,点击进入。 6. 在IP设置菜单中,通常默认为“DHCP”(动态IP分配)。如果要切换为静态IP,请选择“静态”或“手动”选项。 7. 在静态IP设置中,输入您想要使用的IP地址、子网掩码、默认网关和DNS服务器。确保这些信息准确无误,一般可以从网络管理员或路由器配置中获取。 8. 输入完毕后,点击“保存”或“应用”按钮,以应用并保存新的静态IP设置。 9. 返回网络设置主菜单,重新启动RK3399设备,以使新的静态IP设置生效。 在完成以上步骤后,您的RK3399 Android 10.0设备将会使用您所提供的静态IP地址进行以太网连接。请注意,静态IP设置通常用于特定网络环境中,如企业网络或技术调试,一般家庭用户使用动态IP更为常见。
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值