CDMA手機兩種實現模式:
機卡分離式:用戶信息寫在單獨的UIM卡
機卡一體式:用戶信息寫在手機中的
這個跟CDMA Subscription模式有關,對於我們來說使用的是獨立UIM卡,在軟件里面使用什么方式,跟一項NV值有關,但這項值卻無法使用QXDM來更改,確切的說是改了,重新開機之后值又被寫回去了,
所以這項NV值應當是在代碼中設置的,高通一直說在網絡設置里面,但是也一直沒有找到,看了代碼才知道由於某種原因沒顯示出來,都不管了,直接找到CDMA信息讀取模式設置代碼改成UIM模式即可。
下面看這個設置的過程:
public static void makeDefaultPhone(Context context) { //Get cdmaSubscription mode from Settings.Secure
int cdmaSubscription; //從數據庫讀取cdma Subscription 默認preferredCdmaSubscription
cdmaSubscription = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.CDMA_SUBSCRIPTION_MODE, preferredCdmaSubscription); Log.i(LOG_TAG, "Cdma Subscription set to " + cdmaSubscription); //傳遞cdma Subscription 創建RIL
sCommandsInterface = new RIL(context, networkMode, cdmaSubscription); …… }
這里默認的preferredCdmaSubscription就是
preferredCdmaSubscription = CdmaSubscriptionSourceManager.PREFERRED_CDMA_SUBSCRIPTION;
而PREFERRED_CDMA_SUBSCRIPTION = SUBSCRIPTION_FROM_NV;
這里看到從NV中讀取,即用戶信息存儲在手機上,cdma Subscription的信息都在CdmaSubscriptionSourceManager這個類中維護
但是這跟關於這個NV項有什么關系呢?
public RIL(Context context, int preferredNetworkType, int cdmaSubscription, Integer instanceId) { mCdmaSubscription = cdmaSubscription; } private void processUnsolicited (Parcel p) { case RIL_UNSOL_RIL_CONNECTED: { // Initial conditions
setRadioPower(false, null); setPreferredNetworkType(mPreferredNetworkType, null); //啟動RIL建立連接之后,會設置Cdma Subscription 這就是創建java層RIL時傳遞的 //此處應當傳遞到modem,設置了相關的NV項,所以使用工具更改此NV不起作用
setCdmaSubscriptionSource(mCdmaSubscription, null); break; } }
所以關於Cdma Subscription 模式的設置,應當重點關注
CdmaSubscriptionSourceManager
這個類很簡單,是一個Handler,監聽維護CDMA subscription模式;
// Constructor
private CdmaSubscriptionSourceManager(Context context, CommandsInterface ci) { mContext = context; mCM = ci; //監聽Cdma Subscription 模式變化
mCM.registerForCdmaSubscriptionChanged(this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null); mCM.registerForOn(this, EVENT_RADIO_ON, null); //設置當前Cdma Subscription 獲取默認的
int subscriptionSource = getDefaultCdmaSubscriptionSource(); mCdmaSubscriptionSource.set(subscriptionSource); }
其他模塊獲取當前CDMA Subscription模式
public int getCdmaSubscriptionSource() { return mCdmaSubscriptionSource.get(); }