安卓网络类型设置的实现
工作背景:公司出口國外某國的設(shè)備,因為該國對4G認證要求較高,流程非常麻煩,客戶不想取得4G方面認證,因此訂單機器設(shè)備需禁用4G,且不能手動恢復(fù)4G,默認3G/2G(auto)模式。
實現(xiàn)思路:在安卓系統(tǒng)的設(shè)置功能里面有設(shè)置網(wǎng)絡(luò)類型的功能,根據(jù)設(shè)置時走的流程,默認設(shè)置開機時網(wǎng)絡(luò)為3G/2G,并刪除切換網(wǎng)絡(luò)類型的選項。
工作步驟:首先,了解設(shè)置中網(wǎng)絡(luò)類型設(shè)置的實現(xiàn)。
安卓系統(tǒng)對網(wǎng)絡(luò)設(shè)置操作過程:設(shè)置(settings)->更多(more)->移動網(wǎng)絡(luò)(Mobile networks)->首選網(wǎng)絡(luò)類型(preferred network type)
1、設(shè)置(settings)模塊的布局文件為:packages\apps\Settings\res\xml\dashboard_categories.xml,其中下面部分的代碼對應(yīng)的是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文件,
發(fā)現(xiàn)加載:addPreferencesFromResource(R.xml.wireless_settings);?
3、通過更多(more)的布局文件packages\apps\Settings\res\xml\wireless_settings.xml文件發(fā)現(xiàn),啟動了Phone模塊的,MobileNetworkSettings.java文件,其中下面部分的代碼對應(yīng)的是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、點擊移動網(wǎng)絡(luò)(Mobile networks)時,通過 MobileNetworkSettings.java發(fā)現(xiàn)是里面的控件NetWork Mode控件: addPreferencesFromResource(R.xml.network_setting);?
文件加載的packages\services\Telephony\res\xml\network_setting.xml,它是移動網(wǎng)絡(luò)的布局文件。其中下面部分的代碼對應(yīng)的是移動網(wǎng)絡(luò)中的首選網(wǎng)絡(luò)類型(preferred network type)選項,根據(jù)插入的SIM卡的情況,分別選擇顯示下面兩個按鈕中的哪一個:
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);?
然后執(zhí)行里面的語句,設(shè)置聯(lián)網(wǎng)模式:
//Set the modem network mode
setPreferredNetworkType(modemNetworkMode);? 該函數(shù)實現(xiàn)的方法為:
8、跟蹤到framework層,找尋Phone.java文件,具體目錄所在:frameworks\opt\telephony\src\java\com\android\internal\telephony\Phone.java
發(fā)現(xiàn)Phone.java僅僅是一個接口,而被PhoneBase.java文件所實現(xiàn)(PhoneBase extends Handler implements Phone),設(shè)置網(wǎng)絡(luò)類型的函數(shù)。
public void setPreferredNetworkType(int networkType, Message response) {mCi.setPreferredNetworkType(networkType, response); }其實實際上是public CommandsInterface mCi; 接口實現(xiàn)的
protected PhoneBase(PhoneNotifier notifier, Context context, CommandsInterface ci, boolean unitTestMode) {this.mNotifier = notifier;this.mContext = context;mLooper = Looper.myLooper();mCi = ci; }9、最后網(wǎng)絡(luò)上說在RIL.java文件中可以找到設(shè)置網(wǎng)絡(luò)類型的地方(我也不知道是怎么對應(yīng)的):
@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 中實現(xiàn)向modem發(fā)送請求的方法?
領(lǐng)導(dǎo)說,此處后面的部分由安卓在modem中實現(xiàn)在modem中實現(xiàn)。該部分不在源碼中實現(xiàn),因此也無法往下分析。
?***************************************************華麗分割線************************************************
過程搞懂了,如何實現(xiàn)呢?以我們公司的安卓源碼為例:
1、?在device\qcom\XXXX\system.prop文件中定義了參數(shù)default_network,設(shè)置默認網(wǎng)絡(luò)類型。
2、在frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java中獲取默認網(wǎng)絡(luò)類型
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中定義了各種網(wǎng)絡(luò)類型的值,安卓中默認值為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中將上面的值賦值給一個全局變量,在安卓中其他地方調(diào)用時就可以直接使用全局變量--Phone.NT_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA
6、安卓開機時會調(diào)用frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\MobilePhone.java中的getDispNet(Context context)函數(shù)獲取網(wǎng)絡(luò)類型,該函數(shù)調(diào)用getNetworkTypeName(Context context)函數(shù),進一步調(diào)用getTelNetType(Context context)函數(shù),最終調(diào)用telephonyManager.getNetworkType()函數(shù)。
?
7、getNetworkType()函數(shù)實現(xiàn)方法所在目錄frameworks\base\telephony\java\android\telephony\TelephonyManager.java,該方法最終調(diào)用的是telephony.getDataNetworkTypeForSubscriber(subId)。注:TelephonyManager中含有獲取SIM卡等信息的方法,使用如下:
?Android的Api中已經(jīng)定義了各種網(wǎng)絡(luò)狀態(tài),也在TelephonyManager里面的定義
補充:
GPRS 2G(2.5) General Packet Radia Service 114kbps EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps UMTS 3G WCDMA 聯(lián)通3G Universal Mobile Telecommunication System 完整的3G移動通信技術(shù)標準 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 - 無線電傳輸技術(shù)) 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 集成數(shù)字增強型網(wǎng)絡(luò) (屬于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的中間產(chǎn)物 Evolved High Rate Packet Data HRPD的升級 HSPAP 3G HSPAP 比 HSDPA 快些?
轉(zhuǎn)載于:https://www.cnblogs.com/cengjingnianshao/p/9325962.html
總結(jié)
以上是生活随笔為你收集整理的安卓网络类型设置的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins设置用户权限
- 下一篇: 编辑二进制文件