android 8.1 framework层修改以太网静态ip功能
2019-01-25 09:47
3643 查看
Android5.0基础上到Android7.0,Android都自带了以太网的设置功能,基本上都是将ip地址和网关之类的信息通过StaticIpConfiguration该对象实现联网功能。到了Android 8.1 如果还是照着7.0的来写,可能会出现配置了基本信息,却不能通过静态ip上网的情况。不要问我怎么知道的,因为我就是碰到这个 坑了。
我默认你们已经知道怎么去实现设置ip的功能。在这个基础上,我们只需要修改一下framework层的代码就好。
设置静态ip的代码:
[code]Editor etherEditor = etherModePreferences.edit(); etherEditor.putString("ether_mode", "STATIC"); etherEditor.commit(); try { StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration(); InetAddress mIpAddr = NetworkUtils.numericToInetAddress(mIpaddr.getText().toString()); String[] strs = mMask.getText().toString().split("\\."); int count = 0; for(String str : strs){ if(str.equals("255")){ count++; } } int prefixLength = count*8; LinkAddress mIpAddress = new LinkAddress(mIpAddr,prefixLength); InetAddress mGateway = NetworkUtils.numericToInetAddress(mGw.getText().toString()); ArrayList<InetAddress> mDnsServers = new ArrayList<InetAddress>(); mDnsServers.add(NetworkUtils.numericToInetAddress(mDns1.getText().toString())); mDnsServers.add(NetworkUtils.numericToInetAddress(mDns2.getText().toString())); staticIpConfiguration.ipAddress = mIpAddress; staticIpConfiguration.gateway = mGateway; staticIpConfiguration.dnsServer 4000 s.addAll(mDnsServers); config = new IpConfiguration(IpAssignment.STATIC, ProxySettings.NONE, staticIpConfiguration, ProxyInfo.buildDirectProxy(null,0)); mEthManager.setConfiguration(config); }catch (Exception e) { e.printStackTrace(); } [点击并拖拽以移动]
通过上面的代码可以把静态ip地址设置,但是你发现你只写了这写方法并不能用以太网实现联网功能。这个时候我们就需要修改
frameworks\opt\net\ethernet\java\com\android\server\ethernet目录下面的EthernetNetworkFactory文件,代码如下:
[code]public void startIpManager() { if (DBG) { Log.d(TAG, String.format("starting IpManager(%s): mNetworkInfo=%s", mIface, mNetworkInfo)); } LinkProperties linkProperties; IpConfiguration config = mEthernetManager.getConfiguration(); if (config.getIpAssignment() == IpAssignment.STATIC) { if (!setStaticIpAddress(config.getStaticIpConfiguration())) { // We've already logged an error. return; } linkProperties = config.getStaticIpConfiguration().toLinkProperties(mIface); /* } else { mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr); IpManager.Callback ipmCallback = new IpManager.Callback() { @Override public void onProvisioningSuccess(LinkProperties newLp) { mHandler.post(() -> onIpLayerStarted(newLp)); } @Override public void onProvisioningFailure(LinkProperties newLp) { mHandler.post(() -> onIpLayerStopped(newLp)); } @Override public void onLinkPropertiesChange(LinkProperties newLp) { mHandler.post(() -> updateLinkProperties(newLp)); } }; stopIpManager(); mIpManager = new IpManager(mContext, mIface, ipmCallback); */ if (config.getProxySettings() == ProxySettings.STATIC || config.getProxySettings() == ProxySettings.PAC) { // mIpManager.setHttpProxy(config.getHttpProxy()); linkProperties.setHttpProxy(config.getHttpProxy()); } /* final String tcpBufferSizes = mContext.getResources().getString( com.android.internal.R.string.config_ethernet_tcp_buffers); */ String tcpBufferSizes = mContext.getResources().getString( com.android.internal.R.string.config_ethernet_tcp_buffers); /* if (!TextUtils.isEmpty(tcpBufferSizes)) { mIpManager.setTcpBufferSizes(tcpBufferSizes); } */ if (TextUtils.isEmpty(tcpBufferSizes) == false) { linkProperties.setTcpBufferSizes(tcpBufferSizes); } } else { mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr); } /* final ProvisioningConfiguration provisioningConfiguration = mIpManager.buildProvisioningConfiguration() .withProvisioningTimeoutMs(0) .build(); mIpManager.startProvisioning(provisioningConfiguration); */ // } IpManager.Callback ipmCallback = new IpManager.Callback() { @Override public void onProvisioningSuccess(LinkProperties newLp) { mHandler.post(() -> onIpLayerStarted(newLp)); } @Override public void onProvisioningFailure(LinkProperties newLp) { mHandler.post(() -> onIpLayerStopped(newLp)); } @Override public void onLinkPropertiesChange(LinkProperties newLp) { mHandler.post(() -> updateLinkProperties(newLp)); } }; stopIpManager(); mIpManager = new IpManager(mContext, mIface, ipmCallback); if (config.getProxySettings() == ProxySettings.STATIC || config.getProxySettings() == ProxySettings.PAC) { mIpManager.setHttpProxy(config.getHttpProxy()); } final String tcpBufferSizes = mContext.getResources().getString( com.android.internal.R.string.config_ethernet_tcp_buffers); if (!TextUtils.isEmpty(tcpBufferSizes)) { mIpManager.setTcpBufferSizes(tcpBufferSizes); } if (config.getIpAssignment() == IpAssignment.STATIC) { mIpManager.startProvisioning(config.getStaticIpConfiguration()); } else { final ProvisioningConfiguration provisioningConfiguration = mIpManager.buildProvisioningConfiguration() .withProvisioningTimeoutMs(0) .build(); mIpManager.startProvisioning(provisioningConfiguration); } }
通过设置修改以上代码就可以实现上网功能了。希望能对需要的人有用。
相关文章推荐
- [轉載]Android 8.1 增加以太网设置功能
- Android修改手机壁纸功能
- android monitor tool (8.0 监控文件系统 添加哪个进程修改文件功能)
- Android实现编程修改手机静态IP的方法
- dm37xx android2.3.4增加recovery升级功能(一) —— 代码修改
- Android手机联系人源码(添加联系人页面一个功能)修改
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)
- Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- [Android app] 糗事百科App最新10.3.2去广告 功能修改优化版
- Android4.2 系统设置修改,移除android setting的部分功能
- android OTA 的功能实现和修改
- Android常用实例——实现修改用户头像功能
- Android 8.1 功能和API 自动填充
- Android根据xml配置文件动态修改九宫格功能配置
- 修改Android的Framework层操作小记
- Android 实现卫星菜单功能,可定制性很高,可随意修改