当前位置: 首页 > news >正文

Android Settings 有线网设置界面优化

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

        <activity
        android: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-alias
        android: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

http://www.dtcms.com/a/108912.html

相关文章:

  • 基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 【C++】Cplusplus进阶
  • 2025徘徊与坚守:在传统与变革间寻找自己
  • 启服云专利管理系统:铸就知识产权保护的坚固壁垒
  • 基于YOLOv8的热力图生成与可视化:支持自定义模型与置信度阈值的多维度分析
  • Python第七章08:导入自定义(个性化)模块
  • 程序化广告行业(55/89):DMP与DSP对接及数据统计原理剖析
  • 06-公寓租赁项目-后台管理-公寓管理篇
  • tomcat 屏蔽版本号
  • 2024青少年信息素养大赛 C++智能算法初赛 小学组 全年级 真题答案详细解析
  • Android 搜索蓝牙界面禁止横屏
  • 【计算机网络应用层】
  • 如何根据用户活跃时间调整邮件发送策略?
  • Python爬虫第4节-请求库urllib的request模块使用
  • 自抗扰ADRC之二阶线性扩展状态观测器(LESO)推导
  • 循环神经网络 - 机器学习任务之异步的序列到序列模式
  • # 使用 Dlib 和 OpenCV 实现基于深度学习的人脸检测
  • Linux命令-vmstat
  • 使用 Spring Boot 和 GraalVM 的原生镜像
  • 算法 | 神教优化算法(Divine Religions Algorithm, DRA)原理,公式,应用,算法改进研究综述,matlab代码
  • 利用AI与设计原则,对复杂性业务抽象的一次实战
  • Linux文件系统选择指南:XFS or EXT4
  • MCP Servers是什么?
  • 数学复习(12)关于三角函数极限和求导
  • Jackson 处理 JSON 生成与解析指南
  • 逆透视投影 torch
  • 全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比
  • XXS漏洞零基础学习到入门
  • 通用的动态定时任务系统
  • 【动态规划】二分优化最长上升子序列