Android Settings 有线网设置界面优化
文章目录
- Android Settings 有线网设置界面优化
- 一、前言
- 二、简单修改
- 1、修改的EthernetSettings代码:
- 2、有线网ip获取代码:
- 3、AndroidManifest.xml定义有线网的Activity
- 4、修改后界面:
- 三、其他
- 1、有线网设置界面优化小结
- 2、Android 拉起开发者设置界面命令和代码实现
- 3、Android13 有线网开关研究
- 4、Android14 Settings应用添加有线网开关条目实现
- 5、Android 获取ip地址多种方式介绍
一、前言
快清明放假了,说点简单的,有线网设置,估计只对部分系统开发的人有点用。
Android 原生设置应用好像大部分方案都是没有显示有线网设置界面的;
从接触的方案看只有rk方案的原生设置应用显示了有线网设置界面,和热点设置界面是同级目录显示的。
如下图所示:
但是这个有线网设置界面又是存在点问题的:
有线网DHCP自动获取模式下,是无法获取到ip的;
只有在设置了静态ip的模式下,才显示ip和其他信息。
如下图,所示:
难道是RK从谷歌的一个调试分支下载的Settings源码?
但是不应该啊,谷歌不会犯这么低级的错误吧,并且Ethernet的相关字符串都没有国际化,只有英文的;
并且查看里面获取有线网ip的地方居然使用的是反射,系统应用按道理是可以调用framework的隐藏方法的!
所以我大胆的猜测:这个有线网设置界面是RK自己添加的,并且是很久的代码了,
一直挪用下来,未重新适配,看了她Android15提供的代码也是一样的问题。
这个也是一个小bug,本文只简单修改一下。
二、简单修改
1、修改的EthernetSettings代码:
Settings\src\com\android\settings\ethernet\EthernetSettings.java
public class EthernetSettings extends SettingsPreferenceFragment ...{private static final String TAG = "EthernetSettings";private void refreshUI() {Iterator<String> iterator = mEthInfoList.keySet().iterator();while (iterator.hasNext()) {String key = iterator.next();String prefix = key + PREFIX_SPLIT;EthInfo info = mEthInfoList.get(key);log("info = " + info);if (info != null) {
- setStringSummary(prefix + KEY_ETH_IP_ADDRESS, info.getIpAddress());
+ IpConfiguration ipConfiguration = Reflect_getConfiguration("eth0");
+ IpAssignment mode = ipConfiguration.getIpAssignment();
+ if (mode == IpAssignment.DHCP || mode == IpAssignment.UNASSIGNED) {
+ log("tyty DHCP ========= ");
+ setStringSummary(prefix + KEY_ETH_IP_ADDRESS, getEthernetIpAddress());
+ }else{
+ setStringSummary(prefix + KEY_ETH_IP_ADDRESS, info.getIpAddress());}
上面只是把显示ip地址那行替换成了getEthernetIpAddress()方法获取的有线网ip地址就行;
2、有线网ip获取代码:
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.LinkProperties;private ConnectivityManager mConnectivityManager;mConnectivityManager = (ConnectivityManager) getActivity().getSystemService(getActivity().CONNECTIVITY_SERVICE);public String getEthernetIpAddress() {Log.d(TAG,"");final Network network = getFirstEthernet();if (network == null) {return "";}final LinkProperties linkProperties = mConnectivityManager.getLinkProperties(network);if (linkProperties != null) {for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {InetAddress inetAddress = linkAddress.getAddress();if (inetAddress instanceof Inet4Address) {return inetAddress.getHostAddress();}}}return "";}public Network getFirstEthernet() {final Network[] networks = mConnectivityManager.getAllNetworks();for (final Network network : networks) {NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network);if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {return network;}}return null;}
3、AndroidManifest.xml定义有线网的Activity
<activityandroid:name="Settings$EthernetSettingsActivity"android:label="@string/ethernet_settings_title"android:icon="@drawable/ic_settings_wireless"android:taskAffinity=""android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.VOICE_LAUNCH" /><category android:name="com.android.settings.SHORTCUT" /></intent-filter><meta-data android:name="com.android.settings.FRAGMENT_CLASS"android:value="com.android.settings.ethernet.EthernetSettings" /></activity><!-- Keep compatibility with old shortcuts. --><activity-aliasandroid:name=".EthernetSettings"android:label="@string/ethernet_settings"android:clearTaskOnLaunch="true"android:targetActivity="Settings$EthernetSettingsActivity"android:exported="true"><meta-data android:name="com.android.settings.FRAGMENT_CLASS"android:value="com.android.settings.EthernetSettings" /></activity-alias>
从上面代码可以看到可以使用adb拉起有线网设置界面命令:
am start -n com.android.settings/.Settings\$EthernetSettingsActivity
am start -n com.android.settings/.EthernetSettings //有点bug,不一定能打开
如果无法使用上面命令打开有线网设置,那么设置应用应该就是没有有线网设置界面的。
比如我开发的:MTK和AML方案的原生设置代码就没有有线网设置界面。
4、修改后界面:
没有大改,只显示了ip地址,其实动态获取有线网的情况,网关,dns那些都应该隐藏的。
后续有时时间再介绍一下有线网修改配置信息最新的api(Android13增加)吧。
三、其他
1、有线网设置界面优化小结
目前是rk方案存在的问题,其实没啥需求可以隐藏这个条目的;
如果要显示ip就按照上面的修改一下吧。
2、Android 拉起开发者设置界面命令和代码实现
有些情况,原生设置是隐藏的或者不想打开原生设置,如何直接拉起开发者选项呢?
是否有命令或者代码可以实现呢?
下面简单介绍一下:
https://blog.csdn.net/wenzhi20102321/article/details/146985730
3、Android13 有线网开关研究
Android13 的api 提供了有线网开关 EthernetManager.setEthernetEnabled(boolean),
Android9 如果要设置有线网开关,需要自己实现。
https://blog.csdn.net/wenzhi20102321/article/details/131871354
4、Android14 Settings应用添加有线网开关条目实现
Android 原生Settings应用没有有线网开关条目;
Tv平台一般是有有线网连接的,如果没有有线网控制条目是不太方便的;
如果要在原生Settings添加有线网开关和显示有线网ip,要如何实现呢?
本文简单实现一下,有需要的可以参考修改:
https://blog.csdn.net/wenzhi20102321/article/details/146536467
5、Android 获取ip地址多种方式介绍
adb shell 的 ifconfig可以获取当前设备网络节点信息;
这些信息使用Android代码也是可以获取的;
Android 获取网络ip有多种方式,有时候某种方式获取失败的情况下;
那么就可以换一种获取方式,所有多学习一下获取网络ip相关信息是有用的。
https://blog.csdn.net/wenzhi20102321/article/details/141673195