日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓网络类型设置的实现

發布時間:2025/6/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓网络类型设置的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

工作背景:公司出口國外某國的設備,因為該國對4G認證要求較高,流程非常麻煩,客戶不想取得4G方面認證,因此訂單機器設備需禁用4G,且不能手動恢復4G,默認3G/2G(auto)模式。

實現思路:在安卓系統的設置功能里面有設置網絡類型的功能,根據設置時走的流程,默認設置開機時網絡為3G/2G,并刪除切換網絡類型的選項。

工作步驟:首先,了解設置中網絡類型設置的實現。

安卓系統對網絡設置操作過程:設置(settings)->更多(more)->移動網絡(Mobile networks)->首選網絡類型(preferred network type)

1、設置(settings)模塊的布局文件為:packages\apps\Settings\res\xml\dashboard_categories.xml,其中下面部分的代碼對應的是settings中的more選項:

<!-- Operator hook --><dashboard-tileandroid:id="@+id/operator_settings"android:fragment="com.android.settings.WirelessSettings" ><intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" /></dashboard-tile><!-- Other wireless and network controls --><dashboard-tileandroid:id="@+id/wireless_settings"android:title="@string/radio_controls_title"android:fragment="com.android.settings.WirelessSettings"android:icon="@drawable/ic_settings_more"/></dashboard-category>

2、點擊more以后進入Mobile networks, packages\apps\Settings\src\com\android\settings\WirelessSettings.java文件,

發現加載:addPreferencesFromResource(R.xml.wireless_settings);?

3、通過更多(more)的布局文件packages\apps\Settings\res\xml\wireless_settings.xml文件發現,啟動了Phone模塊的,MobileNetworkSettings.java文件,其中下面部分的代碼對應的是more中的Mobile networks選項:

<PreferenceScreenandroid:key="mobile_network_settings"android:title="@string/network_settings_title"settings:keywords="@string/keywords_more_mobile_networks"android:dependency="toggle_airplane"><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.android.phone"android:targetClass="com.android.phone.MobileNetworkSettings" /></PreferenceScreen>

目錄:packages\services\Telephony\src\com\android\phone\MobileNetworkSettings.java?

4、點擊移動網絡(Mobile networks)時,通過 MobileNetworkSettings.java發現是里面的控件NetWork Mode控件: addPreferencesFromResource(R.xml.network_setting);?
文件加載的packages\services\Telephony\res\xml\network_setting.xml,它是移動網絡的布局文件。其中下面部分的代碼對應的是移動網絡中的首選網絡類型(preferred network type)選項,根據插入的SIM卡的情況,分別選擇顯示下面兩個按鈕中的哪一個:

<ListPreferenceandroid:key="preferred_network_mode_key"android:title="@string/preferred_network_mode_title"android:summary="@string/preferred_network_mode_summary"android:entries="@array/preferred_network_mode_choices"android:entryValues="@array/preferred_network_mode_values"android:dialogTitle="@string/preferred_network_mode_dialogtitle" /><ListPreferenceandroid:key="enabled_networks_key"android:title="@string/preferred_network_mode_title"android:summary="@string/preferred_network_mode_summary"android:entries="@array/enabled_networks_choices"android:entryValues="@array/enabled_networks_values"android:dialogTitle="@string/preferred_network_mode_dialogtitle" />

5、通過preferred_network_mode_key回到MobileNetworkSettings.java中找尋BUTTON_PREFERED_NETWORK_MODE.

private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key";
private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key";

6、找到語句,確定是對象mButtonPreferredNetworkMode:
mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference(BUTTON_PREFERED_NETWORK_MODE);
mButtonEnabledNetworks = (ListPreference) prefSet.findPreference(BUTTON_ENABLED_NETWORKS_KEY);

7、找到這個listpreference的點擊事件:

public boolean onPreferenceChange(Preference preference, Object objValue) {if (preference == mButtonPreferredNetworkMode) {//NOTE onPreferenceChange seems to be called even if there is no change//Check if the button value is changed from the System.SettingmButtonPreferredNetworkMode.setValue((String) objValue);

?

然后執行里面的語句,設置聯網模式:
//Set the modem network mode
setPreferredNetworkType(modemNetworkMode);? 該函數實現的方法為:

mPhone.setPreferredNetworkType(modemNetworkMode, mHandler.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));

8、跟蹤到framework層,找尋Phone.java文件,具體目錄所在:frameworks\opt\telephony\src\java\com\android\internal\telephony\Phone.java

發現Phone.java僅僅是一個接口,而被PhoneBase.java文件所實現(PhoneBase extends Handler implements Phone),設置網絡類型的函數。

public void setPreferredNetworkType(int networkType, Message response) {mCi.setPreferredNetworkType(networkType, response); }

其實實際上是public CommandsInterface mCi; 接口實現的

protected PhoneBase(PhoneNotifier notifier, Context context, CommandsInterface ci, boolean unitTestMode) {this.mNotifier = notifier;this.mContext = context;mLooper = Looper.myLooper();mCi = ci; }

9、最后網絡上說在RIL.java文件中可以找到設置網絡類型的地方(我也不知道是怎么對應的):

@Overridepublic void setPhoneType(int phoneType) { // Called by CDMAPhone and GSMPhone constructorif (RILJ_LOGD) riljLog("setPhoneType=" + phoneType + " old value=" + mPhoneType);mPhoneType = phoneType;}public void setPreferredNetworkType(int networkType , Message response) {RILRequest rr = RILRequest.obtain(RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, response);rr.mParcel.writeInt(1);rr.mParcel.writeInt(networkType);mPreferredNetworkType = networkType;if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)+ " : " + networkType);send(rr);}

擴展CommandsInterface接口主要為了在RIL.java 中實現向modem發送請求的方法?

領導說,此處后面的部分由安卓在modem中實現在modem中實現。該部分不在源碼中實現,因此也無法往下分析。
?***************************************************華麗分割線************************************************

過程搞懂了,如何實現呢?以我們公司的安卓源碼為例:
1、?在device\qcom\XXXX\system.prop文件中定義了參數default_network,設置默認網絡類型。

# Start in global mode ro.telephony.default_network=22

2、frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java中獲取默認網絡類型

type = SystemProperties.getInt("persist.radio.default_network", -1);if (type == TYPE_NONE) {type = SystemProperties.getInt("ro.telephony.default_network", RILConstants.PREFERRED_NETWORK_MODE);}String val = Integer.toString(type);for (int phoneId = 1; phoneId < phoneCount; phoneId++) {val = val + "," + type;}loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, val);

?3、Settings.Global.PREFERRED_NETWORK_MODE的定義在文件frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\Settings.java中:

public static final String PREFERRED_NETWORK_MODE = "preferred_network_mode";MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_NETWORK_MODE);

?4、frameworks\base\telephony\java\com\android\internal\telephony\RILConstants.java中定義了各種網絡類型的值,安卓中默認值為22

int NETWORK_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA = 22; /* TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo */

?5、frameworks\opt\telephony\src\java\com\android\internal\telephony\Phone.java中將上面的值賦值給一個全局變量,在安卓中其他地方調用時就可以直接使用全局變量--Phone.NT_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA

int NT_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA = RILConstants.NETWORK_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA;

6、安卓開機時會調用frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\MobilePhone.java中的getDispNet(Context context)函數獲取網絡類型,該函數調用getNetworkTypeName(Context context)函數,進一步調用getTelNetType(Context context)函數,最終調用telephonyManager.getNetworkType()函數。

?
7、getNetworkType()函數實現方法所在目錄frameworks\base\telephony\java\android\telephony\TelephonyManager.java,該方法最終調用的是telephony.getDataNetworkTypeForSubscriber(subId)。注:TelephonyManager中含有獲取SIM卡等信息的方法,使用如下:

//獲取系統的TelephonyManager TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //獲取設備編號 mId = mTelephonyManager.getDeviceId(); //獲取系統平臺版本 mVersion=mTelephonyManager.getDeviceSoftwareVersion(); //獲取網絡運營商代號 mOperator=mTelephonyManager.getNetworkOperator(); //獲取網絡運營商名稱 mName=mTelephonyManager.getNetworkOperatorName(); //獲取手機網絡類型 mType = mTelephonyManager.getPhoneType(); //獲取設備所在位置 mLocation=mTelephonyManager.getCellLocation(); //獲取SIM卡的國別 mIso=mTelephonyManager.getSimCountryIso(); //獲取SIM卡的序列號 mNumber=mTelephonyManager.getSimSerialNumber(); //獲取SIM卡狀態 mState = mTelephonyManager.getSimState();

?Android的Api中已經定義了各種網絡狀態,也在TelephonyManager里面的定義

public static final int NETWORK_TYPE_UNKNOWN Network is unknown 0 (不知道網絡類型) public static final int NETWORK_TYPE_GPRS network is GPRS 1 (2.5G)移動和聯通public static final int NETWORK_TYPE_EDGE network is EDGE 2 (2.75G)2.5G到3G的過渡 移動和聯通public static final int NETWORK_TYPE_UMTS network is UMTS 3 (3G)聯通 public static final int NETWORK_TYPE_CDMA network is CDMA: Either IS95A or IS95B 4 (2G 電信)public static final int NETWORK_TYPE_EVDO_0 network is EVDO revision0 5 (3G)電信public static final int NETWORK_TYPE_EVDO_A network is EVDO revisionA 6 (3.5G) 屬于3G過渡public static final int NETWORK_TYPE_1xRTT network is 1xRTT 7 ( 2G )public static final int NETWORK_TYPE_HSDPA network is HSDPA 8 (3.5G)public static final int NETWORK_TYPE_HSUPA network is HSUPA 9 (3.5G)public static final int NETWORK_TYPE_HSPA network is HSPA 10 (3G)聯通 public static final int NETWORK_TYPE_IDEN network is iDen 11 (2G)public static final int NETWORK_TYPE_EVDO_B network is EVDO revisionB 12 3G-3.5Gpublic static final int NETWORK_TYPE_LTE network is LTE 13 (4G)public static final int NETWORK_TYPE_EHRPD network is eHRPD 14 3G(3G到4G的升級產物)public static final int NETWORK_TYPE_HSPAP network is HSPA+ 15 ( 3G )

補充:

GPRS 2G(2.5) General Packet Radia Service 114kbps EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps UMTS 3G WCDMA 聯通3G Universal Mobile Telecommunication System 完整的3G移動通信技術標準 CDMA 2G 電信 Code Division Multiple Access 碼分多址 EVDO_0 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 屬于3G EVDO_A 3G 1.8mbps - 3.1mbps 屬于3G過渡,3.5G 1xRTT 2G CDMA2000 1xRTT (RTT - 無線電傳輸技術) 144kbps 2G的過渡, HSDPA 3.5G 高速下行分組接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps HSUPA 3.5G High Speed Uplink Packet Access 高速上行鏈路分組接入 1.4 - 5.8 mbps HSPA 3G (分HSDPA,HSUPA) High Speed Packet Access IDEN 2G Integrated Dispatch Enhanced Networks 集成數字增強型網絡 (屬于2G,來自維基百科) EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G LTE 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G過渡,升級版 LTE Advanced 才是4G EHRPD 3G CDMA2000向LTE 4G的中間產物 Evolved High Rate Packet Data HRPD的升級 HSPAP 3G HSPAP 比 HSDPA 快些

?

轉載于:https://www.cnblogs.com/cengjingnianshao/p/9325962.html

總結

以上是生活随笔為你收集整理的安卓网络类型设置的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。