安卓網路類型設定的實現

來源:互聯網
上載者:User

標籤:isp   The   dash   statusbar   reference   keyword   net   完整   對象   

工作背景:公司出口國外某國的裝置,因為該國對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-tile
                android: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-tile
                android: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選項:
    <PreferenceScreen
        android:key="mobile_network_settings"
        android:title="@string/network_settings_title"
        settings:keywords="@string/keywords_more_mobile_networks"
        android:dependency="toggle_airplane">
        <intent
            android: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卡的情況,分別選擇顯示下面兩個按鈕中的哪一個:
    <ListPreference
        android: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" />

    <ListPreference
        android: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.Setting
          mButtonPreferredNetworkMode.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檔案中可以找到設定網路類型的地方(我也不知道是怎麼對應的):

    @Override
    public void setPhoneType(int phoneType) { // Called by CDMAPhone and GSMPhone constructor
        if (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.5G
 
public 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 快些

安卓網路類型設定的實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.