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