Android5.0基础上到Android7.0,Android都自带了以太网的设置功能,基本上都是将ip地址和网关之类的信息通过StaticIpConfiguration该对象实现联网功能。到了Android 8.1 如果还是照着7.0的来写,可能会出现配置了基本信息,却不能通过静态ip上网的情况。不要问我怎么知道的,因为我就是碰到这个 坑了。

设置静态ip的代码:

frameworks\opt\net\ethernet\java\com\android\server\ethernet目录下面的EthernetNetworkFactory文件,代码如下: 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); } }

通过设置修改以上代码就可以实现上网功能了。希望能对需要的人有用。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐