Android14 Settings應用添加有線網開關條目實現

Android14 Settings應用添加有線網開關條目

文章目錄

  • Android14 Settings應用添加有線網開關條目
    • 一、前言
    • 二、適配修改
      • 1、network_provider_settings.xml
      • 2、NetworkProviderSettings.java
      • 3、TurnOnOffEthernetNetworkController.java
      • 4、去除有線網提示條目。
      • 5、效果UI
        • (1)修改前效果
        • (2)修改后效果
    • 三、其他
      • 1、Android Settings應用添加有線網開關條目小結
        • (1)主要修改適配的代碼:
      • 2、關于不同Android系統版本原生Settings Wifi條目的獲取代碼
      • 4、Android13 有線網開關研究
      • 5、Android AccessPoint 已連接的wifi信息未顯示處理

一、前言

背景:
Android 原生Settings應用沒有有線網開關條目;
Tv平臺一般是有有線網連接的,如果沒有有線網控制條目是不太方便的;

如果要在原生Settings添加有線網開關和顯示有線網ip,要如何實現呢?

目前主要的商顯TV中,只有我開發的方案中有些原生設置Settings 在某些方案上有修改了原生Settings的添加有線網開關控制,視源、朗國、創維、三星那些都是沒修改的。

本文簡單實現一下,有需要的可以參考修改。

二、適配修改

1、network_provider_settings.xml

在布局文件添加一個有線網開關UI條目控制;

這個布局文件是點擊二級菜單"互聯網"顯示的界面主要包含條目內容:
有線網提示(接入有線網才有),飛行模式提示(開啟飛行模式才有),
Wifi開關、Wifi列表、添加網絡按鍵,網絡偏好設置,已保存的網絡。

Settings\res\xml\network_provider_settings.xml

    //原本有的有線網提示<Preferenceandroid:key="connected_ethernet_network"android:title="@string/ethernet"android:summary="@string/to_switch_networks_disconnect_ethernet"android:icon="@drawable/ic_settings_ethernet"/>//新增的有線網開關條目
+    <SwitchPreference
+        android:key="ethernet_turn_off"
+        android:title="@string/ethernet" />//飛行模式提示<PreferenceCategoryandroid:key="provider_model_mobile_network"android:title="@string/summary_placeholder"android:layout="@layout/preference_category_no_label"settings:isPreferenceVisible="@bool/config_show_sim_info"settings:controller="com.android.settings.network.NetworkMobileProviderController"/>//Wifi開關<com.android.settingslib.RestrictedSwitchPreferenceandroid:key="main_toggle_wifi"android:title="@string/wifi"settings:keywords="@string/keywords_wifi"settings:allowDividerAbove="true"/>//已連接的Wifi ?<PreferenceCategoryandroid:key="connected_access_point"android:layout="@layout/preference_category_no_label"/>//保持狀態的Wifi列表 ?<PreferenceCategoryandroid:key="first_access_points"android:layout="@layout/preference_category_no_label"/>//剩余的掃描到的的Wifi列表 ?<PreferenceCategoryandroid:key="access_points"android:layout="@layout/preference_category_no_label"/>//網絡偏好設置<Preferenceandroid:key="configure_network_settings"android:title="@string/network_and_internet_preferences_title"settings:allowDividerAbove="true"android:fragment="com.android.settings.wifi.ConfigureWifiSettings"/>//已保存的網絡<Preferenceandroid:key="saved_networks"android:title="@string/wifi_saved_access_points_label"android:fragment="com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2"/>

res/value 的資源文件:

//英文<string name="to_switch_networks_disconnect_ethernet">To switch networks, disconnect ethernet</string>
//中文<string name="to_switch_networks_disconnect_ethernet" msgid="6615374552827587197">"如要切換網絡,請拔出以太網網線"</string>

Android 原生應用沒有有線網開關控制,有線網連接后,
如果正常獲取到有線網ip,是有線使用有線網的,無法正常連接Wifi網絡,
所以會友情提示"如要切換網絡,請拔出有線網".

2、NetworkProviderSettings.java

Wifi開關和Wifi列表顯示都在這個類。

import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;/*** UI for Mobile network and Wi-Fi network settings.*/
@SearchIndexable
public class NetworkProviderSettings extends RestrictedSettingsFragment ...{ConnectedEthernetNetworkController mConnectedEthernetNetworkController;+    TurnOnOffEthernetNetworkController mTurnOnOffEthernetNetworkController;private void addPreferences() {
...addConnectedEthernetNetworkController();
+        addTurnOnOffEthernetNetworkController();}//add by liwenzhi  ++++ 下面這個方法是添加的//主要就是開關監聽,調用方法private void addTurnOnOffEthernetNetworkController() {if (mTurnOnOffEthernetNetworkController == null) {mTurnOnOffEthernetNetworkController =new TurnOnOffEthernetNetworkController(getContext(), TurnOnOffEthernetNetworkController.KEY);}SwitchPreference  switchPreference = (SwitchPreference) findPreference("ethernet_turn_off");mTurnOnOffEthernetNetworkController.updateState(switchPreference);switchPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean isCheck = (boolean) newValue;Log.i(TAG, "onPreferenceChange preference = " + preference + ", isCheck = " + isCheck);mTurnOnOffEthernetNetworkController.onPreferenceChange(preference, newValue);return true;}});}public void onStart() {super.onStart();
+        mTurnOnOffEthernetNetworkController.onStart(); //主要用來廣播監聽 + 更新有線網ip}@Overridepublic void onStop() {
+        mTurnOnOffEthernetNetworkController.onStop(); //停止廣播監聽}}

3、TurnOnOffEthernetNetworkController.java

package com.android.settings.network;import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET;import android.content.Context;
import android.util.Log;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.EthernetManager;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;import androidx.preference.Preference;
import androidx.preference.SwitchPreference;import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;/*** PreferenceController to show the connected ethernet network turn on /off.* 自定義添加的有線網開關*/
public class TurnOnOffEthernetNetworkController extends BasePreferenceController implementsPreference.OnPreferenceChangeListener {private static final String TAG = "TurnOnOffEthernetNetworkController";private static final String NET_CHANGE_ACTION = ConnectivityManager.CONNECTIVITY_ACTION; //所有網絡變化廣播private static final String ETHERNET_STATE_CHANGE = "action.ebsw.eth.status.change"; //底層自定義有線網絡插拔廣播(并非共用的,是底層自己開發的)public static final String KEY = "ethernet_turn_off";private Context mContext;private Preference mPreference;private SettingsValueChangeContentObserver mContentOb; //監聽 Settings ethernet_onpublic TurnOnOffEthernetNetworkController(Context context, String preferenceKey) {super(context, preferenceKey);Log.i(TAG, "TurnOnOffEthernetNetworkController preferenceKey  = " + preferenceKey);mContext = context;//注冊監聽Settings.Global.ETHERNET_ON 屬性變化mContentOb = new SettingsValueChangeContentObserver();context.getContentResolver().registerContentObserver(Settings.System.getUriFor("ethernet_on"), true, mContentOb);//注冊監聽}@Overridepublic String getPreferenceKey() {return KEY;}@Overridepublic int getAvailabilityStatus() {return AVAILABLE;}//自定義的,非原生public void updateState(Preference preference) {Log.i(TAG, "updateState preference = " + preference);final boolean settingsOn = isEthernetEnabled(mContext);Log.i(TAG, "updateState settingsOn = " + settingsOn);((SwitchPreference) preference).setChecked(settingsOn);mPreference = preference;//mPreference.setSummary("on/off:" + settingsOn); //testupdateEthernetIp();}//自定義的,非原生public boolean onPreferenceChange(Preference preference, Object newValue) {final boolean settingsOn = (Boolean) newValue;Log.i(TAG, "onPreferenceChange settingsOn = " + settingsOn);return enableEthernet(mContext, settingsOn);}public boolean enableEthernet(Context context, boolean enabled) {Log.i(TAG, "enableEthernet enabled = " + enabled);EthernetManager ethernetManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);ethernetManager.setEthernetEnabled(enabled);Settings.Global.putInt(context.getContentResolver(),"ethernet_on", enabled? EthernetManager.ETHERNET_STATE_ENABLED:EthernetManager.ETHERNET_STATE_DISABLED);return true;}public boolean isEthernetEnabled(Context context) {Log.i(TAG, "isEthernetEnabled.");int ethernetSate = 0;final ContentResolver cr = context.getContentResolver();try {ethernetSate = Settings.Global.getInt(cr, "ethernet_on", EthernetManager.ETHERNET_STATE_ENABLED);} catch (Exception e) {ethernetSate = EthernetManager.ETHERNET_STATE_DISABLED;}return ethernetSate == EthernetManager.ETHERNET_STATE_ENABLED;}

注意 :Settings.Global.ETHERNET_ON 屬性在 Android8之后的版本好像就沒有了;
如果需要全局定義可以自己在Settings.java源碼中添加定義;
其實也可以不用定義,直接使用 "etherent_on"字符串就行;也是一樣能監聽變化能記憶能使用;

也可以使用prop屬性記錄有線網開關狀態,不過不方便監聽狀態變化。

4、去除有線網提示條目。

Settings\src\com\android\settings\network\ConnectedEthernetNetworkController.java

    @Overridepublic boolean isAvailable() {
-        return mInternetType == INTERNET_ETHERNET;
+        //not to show this item ,change by liwenzhi
+        return false;}

代碼修改可以動態設置顯示或者隱藏,通過某些狀態或者prop屬性;
如果不想改Java代碼,應該是可以在xml文件中直接去除 key=“connected_ethernet_network” 條目那項。

5、效果UI

(1)修改前效果

未接入有線網的情況的顯示:
在這里插入圖片描述
這個是最普通的正常情況的顯示。

接入有線網的情況下的顯示:
在這里插入圖片描述

可以看到這里就提示了讓你拔掉有線網,是不是比較low。

默認情況,wifi和有線網連接是不兼容的,有線網優先級高于wifi,
所以優先連接的是有線網;如果拔出有線網,是會自動連接wifi的;
如果有需求也是可以修改系統源碼,設置有線網和wifi共存,同時連接的。

(2)修改后效果

有線網開關開啟并且接入有線網:
在這里插入圖片描述
這里查看簡單明了的,顯示了有線網開關和有線網ip地址。

有線網開關關閉:
在這里插入圖片描述
這里可以看到有線網關閉后,Wif是可以連接的;
如果打開有線網開關,但是未接入有線網插頭,也是能連接wifi的,只是有線網那里并不顯示ip地址。

三、其他

1、Android Settings應用添加有線網開關條目小結

(1)主要修改適配的代碼:
network_provider_settings.xml //有線網開關條目的添加
NetworkProviderSettings.java //有線網開關條目的關聯
TurnOnOffEthernetNetworkController.java //+自定義的有線網控制顯示類
ConnectedEthernetNetworkController.java //有線網默認提示是否顯示

這里是添加有線網開關設置在三級目錄里面,
也可以添加在二級目錄里面,和Wifi、飛行模式、熱點共享同級目錄下;

2、關于不同Android系統版本原生Settings Wifi條目的獲取代碼

查看了Wifi列表獲取的代碼是有較大差異的:

Android9 或者更低的版本使用的是:
List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();Android11 或者更新的版本獲取Wifi使用的是:
List<WifiEntry> wifiEntries = mWifiPickerTracker.getWifiEntries();因為 AccessPoint 過時了,所以使用的是 WifiEntry;
AccessPoint 是系統SettingsLib包封裝的對象,WifiEntry 是系統framework包的對象;

使用 WifiEntry 對象似乎是為了更容易適配Settings應用的 Preference 布局控件。

無論是AccessPoint還是WifiEntry,都是有暴露 getWifiConfiguration()方法獲取都某個Wifi的配置信息WifiConfiguration對象。

我這里自定義開發的設置應用從Android7開始一直是使用 AccessPoint 那套顯示和連接Wifi,沒啥大問題;
也有一個方案出現過列表不顯示某個已連接的隱藏Wifi的情況,直接修改的SettingsLib源碼解決的。

4、Android13 有線網開關研究

Android13 的api 提供了有線網開關 EthernetManager.setEthernetEnabled(boolean),
Android9 如果要設置有線網開關,需要自己實現。

https://blog.csdn.net/wenzhi20102321/article/details/131871354

5、Android AccessPoint 已連接的wifi信息未顯示處理

一個wifi列表未顯示已連接的wifi信息問題記錄。
本文最后又原生Settings 的Wifi列表界面顯示分析,有興趣的可以看看。

https://blog.csdn.net/wenzhi20102321/article/details/146536423

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899113.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Axure RP設計軟件中的各種函數:包括數字、數學、字符串、時間及中繼器函數,詳細解釋了各函數的用途、參數及其應用場景。

文章目錄 引言函數分類數字函數數學函數字符串函數時間函數函數中繼器函數引言 在axure交互設計時,函數可以用在條件公式和需要賦值的地方,其基本語法是用雙方括號包含,變量值和函數用英文句號連接。 在交互事件編輯器中通過fx按鈕插入函數表達式,例如設置文本內容為: …

c#難點整理3

1.靜態類的說明 a.靜態類里不能定義實例方法&#xff0c;實例屬性&#xff0c;所以說非靜態類是無法繼承靜態類的。父類無法擁有實例化的方法和屬性&#xff0c;子類可以&#xff0c;這從邏輯上是矛盾的&#xff0c;不符合繼承的邏輯。 b.那么靜態類與靜態類之間能否繼承能呢…

AIP-191 文件和目錄結構

編號191原文鏈接https://google.aip.dev/191狀態批準創建日期2019-07-25更新日期2019-07-25 統一的文件和目錄結構&#xff0c;雖然在技術上差別不大&#xff0c;但可以讓用戶和審查者更容易閱讀API界面定義。 指南 注意 以下指南適合于使用protobuf定義的API&#xff0c;例如…

Win11+VS2022+CGAL5.6配置

1. CGAL庫簡介 CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一個開源的計算幾何算法庫&#xff0c;主要用于處理幾何問題和相關算法的實現。它提供了豐富的幾何數據結構和高效算法&#xff0c;覆蓋點、線、多邊形、曲面等基本幾何對象的表示與操…

手搓全自動文章多平臺發布系統:5、跨頁面接入playwright類,修改ui_components.py,整合到main.py

昨天已經要多上下文,單上下文的模塊中測試成功了,今天要想法接入。 整理完成的所有代碼如下: 結構如圖: main.py import sys from PyQt6 import QtWidgets from modules.ui_components import TableManager # 導入界面類 import asyncio# 在主函數中使用 qasync 整合事…

漲薪技術|使用Dockerfile創建鏡像

上次的推文內容中介紹了如何使用docker commit的方法來構建鏡像&#xff0c;相反推薦使用被稱為Dockerfile的定義文件和docker build命令來構建鏡像。Dockerfile使用基本的基于DSL語法的指令來構建一個Docker鏡像&#xff0c;之后使用docker build命令基于該Dockerfile中的指令…

rkipc的h265設置

資料的位置 源代碼在luckfox-pico/project/app/rkipc/rkipc/src/rv1106_ipc/video/video.c中&#xff0c;使用了rkmpi庫&#xff0c;參考資料為"doc/zh/media/Rockchip_Developer_Guide_MPI.pdf" 通道設置設置 H265的通道設置主要由rkipc_pipe_0_init完成&#xf…

成都國際數字影像產業園:打造數字影像產業新高地

成都國際數字影像產業園&#xff1a;打造數字影像產業新高地 成都國際數字影像產業園正致力于構筑數字影像產業的新高地&#xff0c;成為推動區域數字經濟發展的重要引擎。 核心定位與目標 該園區精準定位于數字影像文創產業&#xff0c;旨在打造集內容創作、技術研發、人才…

各類神經網絡學習:(三)RNN 循環神經網絡(中集),同步多對多結構的詳細解釋

上一篇下一篇RNN&#xff08;上集&#xff09;RNN&#xff08;下集&#xff09; 同步多對多結構 1&#xff09;結構詳解 ①圖解&#xff1a; ②參數含義&#xff1a; x t x_t xt? &#xff1a;表示每一個時刻的輸入&#xff1b; o t o_t ot? &#xff1a;表示每一個時刻的輸…

Perl 環境安裝指南

Perl 環境安裝指南 引言 Perl是一種廣泛使用的解釋型、動態編程語言,以其強大的文本處理能力和靈活性著稱。本文將為您詳細介紹Perl環境的安裝過程,包括系統要求、安裝步驟以及注意事項。 系統要求 在安裝Perl之前,請確保您的計算機滿足以下基本要求: 操作系統:Window…

【嵌入式學習2】C語言 - VScode環境搭建

目錄 ## 語言分類 ## c語言編譯器 ## VScode相關配置 ## 語言分類 編譯型語言&#xff1a;C&#xff0c;C解釋型語言&#xff1a;python&#xff0c;JS ## c語言編譯器 分類GCC 系列MinGWCygwinMSVC系列一套編程語言編譯器將GCC編譯器和GNU Binutils移植到Win32平臺下的產物…

qt+opengl 加載三維obj文件

1前面我們已經熟悉了opengl自定義頂點生成一個立方體&#xff0c;并且我們實現了立方體的旋轉&#xff0c;光照等功能。下面我們來用opengl來加載一個obj文件。準備我們首先準備一個簡單的obj文件&#xff08;head.obj&#xff09;。資源在本頁下載 2 在obj文件里面&#xff0c…

0326-Java 字符串方法

package com.qc.字符串;import java.util.Arrays;public class Test {public static void main(String[] args) { // String x"hello";//字符串 char[] // x x"demo";//字符串拼接 // xx2450; // xxtrue; // System.out.println(x);//hellodemo2450t…

<command-line>:0:1: error: macro names must be identifiers m

報錯&#xff1a;:0:1: error: macro names must be identifiers 排查類很久 原來是&#xff1a; add_compile_definitions(_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)寫成了 add_compile_definitions(-D_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)多了個 -D。

風光互補智慧路燈的燈桿設計有哪些要求?

嘿&#xff0c;朋友們&#xff01;叁仟風光互補智慧路燈的燈桿設計那可是超級重要的事兒&#xff0c;得全方位綜合考量各種因素&#xff0c;就是為了確保咱們的路燈能兼具超棒的功能性、絕對的安全性、無敵的美觀性以及超厲害的耐用性&#xff01;下面就來看看這些超贊的常見要…

06、RAG

LLM的知識僅限于它所接受到的訓練數據。如果我們希望讓它了解特定領域的專有知識&#xff0c;則可以使用下面的方式操作&#xff1a; 使用RAG使用專有數據對LLM進行微調RAG與數據微調方式結合使用 什么是RAG 簡單地說&#xff0c;RAG就是把數據發送給LLM之前從數據中查找相關…

自然語言處理:第一百零二章 如何去掉DeepSeek R1思考過程

本人項目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor 寫在前面: 筆者更新不易&#xff0c;希望走過路過點個關注和贊&#xff0c;筆芯!!! 寫在前面: 筆者更新不易&#xff0c;希望走過路過點個關注和贊&#xff0c;筆芯!!! 寫在前面: 筆者更新不易…

flink 安裝與訪問 ui

官方文檔&#xff1a;First steps | Apache Flink 版本&#xff1a;v2.0.0 下載Flink Flink運行在所有類UNIX環境中&#xff0c;即Linux&#xff0c;Mac OS X和Cygwin&#xff08;適用于Windows&#xff09;。您需要安裝Java 11。要檢查安裝的Java版本&#xff0c;請在終端中…

WPF TextBox實現鍵盤enter后實時讀取TextBox中的值

代碼 <TextBox Grid.Column"0" x:Name"textBox" Margin"10,5,0,5" TextWrapping"Wrap" Text"{Binding SendMessage,UpdateSourceTriggerPropertyChanged}" VerticalContentAlignment"Center" CaretBrush&qu…

PyTorch實現Transformer模型

首先&#xff0c;我得回顧一下Transformer的基本結構&#xff0c;確保自己沒有記錯。Transformer由編碼器和解碼器組成&#xff0c;每個編碼器層包含多頭自注意力機制和前饋網絡&#xff0c;解碼器層則還有編碼器-解碼器注意力。 接下來&#xff0c;用戶需要的是手把手的代碼解…