安卓网络类型设置的实现
工作背景:公司出口國外某國的設備,因為該國對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卡的情況,分別選擇顯示下面兩個按鈕中的哪一個:
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);? 該函數實現的方法為:
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,設置默認網絡類型。
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
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卡等信息的方法,使用如下:
?Android的Api中已經定義了各種網絡狀態,也在TelephonyManager里面的定義
補充:
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
總結
以上是生活随笔為你收集整理的安卓网络类型设置的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins设置用户权限
- 下一篇: 编辑二进制文件