ims Registered and Volte enable on Android N
阿新 • • 發佈:2019-02-10
文前
程式碼基於mkm-mr1 android 7.1.2 本篇記錄了調查ims Registered狀態和VoLTE enable狀態的一些取值和更新的關鍵方法。 初衷是調查ims registered狀態和 VoLTE Available有沒有對外提供介面,以及這兩者有什麼邏輯上的關係。 PS:本文采取“雙線敘事”,同時調查ims Registered和Volte enable的關鍵方法,如果讀者感覺有點亂,可以一次只看ims或者volte(這意味著你要看兩遍,其實是我懶不想分開寫)。正文
TelephonyManager.java向系統其他應用(Settings,SystemUI)提供介面,為什麼說是“系統其他應用
/**
* Returns the IMS Registration Status
* @hide
*/
publicboolean isImsRegistered(){
try{
ITelephony telephony = getITelephony();
if(telephony ==null)
return
false;return telephony.isImsRegistered();
}catch(RemoteException ex){
returnfalse;
}catch(NullPointerException ex){
returnfalse;
}
}
下面這個方法返回的是VoLTE status
/**
* Returns the IMS Registration Status
* using subId
* @hide
*/
publicboolean isImsRegisteredForSubscriber(int subId){
try{
ITelephony telephony = getITelephony
();if(telephony ==null)
returnfalse;
return telephony.isImsRegisteredForSubscriber(subId);
}catch(RemoteException ex){
returnfalse;
}catch(NullPointerException ex){
returnfalse;
}
}
到現在為止我們知道TelephonyManager.java中有三個hide方法返回ims registered和VoLTE Status,但都是hide方法,不對第三方應用公開。 packages/services/Telephony PhoneInterfacemanager.java 到了這可以看到,兩個方法呼叫的都是Phone.java 裡的registered()方法(當然,實際呼叫的是ImsPhone.java裡的同名方法)。
/**
* Returns the Status of Volte
* @hide
*/
publicboolean isVolteAvailable(){
try{
return getITelephony().isVolteAvailable();
}catch(RemoteException ex){
returnfalse;
}catch(NullPointerException ex){
returnfalse;
}
}
然後下面這個是VoLTE的,isVolteAvailable和isVolteEnabled居然是等價的,意味著開啟即可用?
@Override
publicboolean isImsRegistered(){
return mPhone.registered();
}
/*
* {@hide}
* Returns the IMS Registration Status based on subId
*/
publicboolean isImsRegisteredForSubscriber(int subId){
finalPhone phone = getPhone(subId);
if(phone !=null){
return phone.isImsRegistered();
}
returnfalse;
}
然後觀察到這個類裡面還有個方法來設定ims registration status的,但是吧其實這個方法沒有使用到。
/*
* {@hide}
* Returns the IMS Registration Status
*/
publicboolean isVolteAvailable(){
return mPhone.isVolteEnabled();
}
Phone.java 這個方法只在GsmCdmaPhone.java裡面重寫了,但是GsmCdmaPhone會有ims服務?
publicvoid setImsRegistrationState(boolean registered){
enforceModifyPermission();
mPhone.setImsRegistrationState(registered);
}
/**
* Set IMS registration state
*/
publicvoid setImsRegistrationState(boolean registered){
}
ImsRegistered的最終取值
fw/opt/telephony ImsPhone.java 下面便是Ims registered取值的終點,接下來看的賦值(更新)的地方。 setImsRegistered()正是給mImsRegistered 賦值的地方而Volte的取值還需再跟進一步
@Override
publicboolean isImsRegistered(){
return mImsRegistered;
}
publicvoid setImsRegistered(boolean value){
mImsRegistered = value;
}
@Override
publicboolean isVolteEnabled(){
return mCT.isVolteEnabled();
}
VolteEnabled的最終取值
fw/opt/telephony ImsPhoneCallTracker.java 來自一個布林值,其實是一個布林數組裡面的其中一個值。
publicboolean isVolteEnabled(){
return mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE];
}
Ims Registered 的更新
巧合的是ims registered的更新也是在這個類裡面
/**
* Listen to the IMS service state change
*
*/
privateImsConnectionStateListener mImsConnectionStateListener =
newImsConnectionStateListener(){
@Override
publicvoid onImsConnected(){
if(DBG) log("onImsConnected");
mPhone.setServiceState(ServiceState.STATE_IN_SERVICE);
mPhone.setImsRegistered(true);
mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
ImsConnectionState.State.CONNECTED,null);
}
@Override
publicvoid onImsDisconnected(ImsReasonInfo imsReasonInfo){
if(DBG) log("onImsDisconnected imsReasonInfo="+ imsReasonInfo);