天天看點

android打開volte代碼,Android8.1 源碼修改之插入SIM卡預設啟用Volte功能

前言

公用電話産品,插入SIM卡後要求自動打開Volte功能,即插即用,用完拔卡就走

實作

第一步 開關對應的代碼

通過列印日志和全局查找,源碼位置 vendor/mediatek/proprietary/packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java

04-15 08:15:29.238 1191-1191/com.android.phone I/NetworkSettings: isUpdateTabsNeeded:- DO_NOTHING newSil.size()=1 mActiveSubInfos.size()=1

04-15 08:15:29.240 1191-1191/com.android.phone D/NetworkSettings: initializeSubscriptions: DO_NOTHING

04-15 08:15:29.240 1191-1191/com.android.phone D/NetworkSettings: convertTabToSlot: info size=1 currentTab=0 slotId=0

04-15 08:15:29.246 1191-1191/com.android.phone I/NetworkSettings: updatePhone:- slotId=0 sir={id=1, iccId=89861114706315182802 simSlotIndex=0 displayName=中國電信 carrierName=中國電信 nameSource=0 iconTint=-16746133 dataRoaming=0 [email protected] mcc 460 mnc 11 isEmbedded false accessRules null}

04-15 08:15:29.246 1191-1191/com.android.phone D/NetworkSettings: updateBody: isLteOnCdma=true phoneSubId=1

04-15 08:15:29.253 1191-1191/com.android.phone D/NetworkSettings: phoneType == PhoneConstants.PHONE_TYPE_CDMA or is CT VOLTE...

04-15 08:15:29.266 1191-1191/com.android.phone D/NetworkSettings: isWorldMode=false

04-15 08:15:29.267 1191-1191/com.android.phone D/NetworkSettings: isWorldMode=false

04-15 08:15:29.267 1191-1191/com.android.phone D/NetworkSettings: settingsNetworkMode: 10

04-15 08:15:29.285 1191-1191/com.android.phone D/NetworkSettings: [addEnhanced4GLteSwitchPreference] volteEnabled :true

04-15 08:15:29.285 1191-1191/com.android.phone D/NetworkSettings: [addEnhanced4GLteSwitchPreference] Remove mButton4glte!

04-15 08:15:29.285 1191-1191/com.android.phone D/NetworkSettings: [addEnhanced4GLteSwitchPreference] ss :false

04-15 08:15:29.307 1191-1191/com.android.phone D/DefaultMobileNetworkSettingsExt: customizeEnhanced4GLteSwitchPreference

04-15 08:15:29.320 1191-1191/com.android.phone D/NetworkSettings: CdmaNetworkSettings destroy [email protected]

04-15 08:15:29.320 1191-1191/com.android.phone D/CdmaNetworkSettings: onDestroy

通過 MtkImsManager.setEnhanced4gLteModeSetting(this, enhanced4gModePref.isChecked(), phoneId); 這行代碼來實作volte的打開、關閉

詳細的分析流程,請看這篇

第二步 插卡後調用開關的代碼

通過插卡後分析日志發現列印 android.intent.action.SIM_STATE_CHANGED, 字面意思Sim卡狀态改變通知, 全局查找到,

源碼位置 vendor\mediatek\proprietary\packages\services\Telephony\src\com\mediatek\settings\cdma\CdmaVolteServiceChecker.java

修改如下

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

Log.d(TAG, "onReceive, action = " + intent.getAction());

updateState();

// cczheng add when recive SIM_STATE_CHANGED default open volte

if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) {

updateVolteState();

}

};

};

//cczheng add check volte is open, and defalut open volte

private void updateVolteState(){

Log.e(TAG, "updateVolteState....");

int subId = getListenSubId();

Log.i(TAG, "isValidSubscriptionId=="+SubscriptionManager.isValidSubscriptionId(subId));

Log.i(TAG, "isCtVolteEnabled=="+TelephonyUtilsEx.isCtVolteEnabled());

if (SubscriptionManager.isValidSubscriptionId(subId) && TelephonyUtilsEx.isCtVolteEnabled()) {

boolean volteOn = MtkImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext,

SubscriptionManager.getPhoneId(subId));

boolean isEnable4gOn = isEnable4gOn(subId);

Log.i(TAG, "isEnable4gOn=="+isEnable4gOn);

Log.i(TAG, "volteOn=="+volteOn);

int phoneId = SubscriptionManager.getPhoneId(subId);

Log.e(TAG, "phoneId = " + phoneId + " subId="+subId);

if (!volteOn) {

MtkImsManager.setEnhanced4gLteModeSetting(mContext, true, phoneId);

}

}

}

private boolean isLteNetwork(int subId) {

boolean isLte = false;

int networkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;

final int dataNetworkType = TelephonyManager.getDefault().getDataNetworkType(subId);

final int voiceNetworkType = TelephonyManager.getDefault().getVoiceNetworkType(subId);

Log.d(TAG, "dataNetworkType = " + dataNetworkType

+ ", voiceNetworkType = " + voiceNetworkType);

if (TelephonyManager.NETWORK_TYPE_UNKNOWN != dataNetworkType) {

networkType = dataNetworkType;

} else if (TelephonyManager.NETWORK_TYPE_UNKNOWN != voiceNetworkType) {

networkType = voiceNetworkType;

}

if ((networkType == TelephonyManager.NETWORK_TYPE_LTE)

|| (networkType == TelephonyManager.NETWORK_TYPE_LTE_CA)) {

isLte = true;

}

Log.d(TAG, "isLte = " + isLte);

return isLte;

}

至此,搞定,簡單說下上面的代碼,當收到SIM狀态改變的廣播,檢查卡的subId是否是有效的(subId>0),卡片是否支援Volte功能,同時滿足則擷取目前Volte是否已啟用,未啟用則調用MtkImsManager.setEnhanced4gLteModeSetting()打開

Android8.1 源碼修改之通過黑名單屏蔽系統短信功能和來電功能

前言 之前寫過一篇Android6.0 的屏蔽系統短信功能和來電功能,具體看這裡 同樣的最近有個新需求,需要将8.1 裝置的來電功能和短信功能都屏蔽掉,特殊産品就是特殊定制,那就開始吧. 屏蔽短信功能 ...

Android6.0 源碼修改之屏蔽系統短信功能和來電功能

一.屏蔽系統短信功能 1.屏蔽所有短信 android 4.2 短信發送流程分析可參考這篇 戳這 源碼位置 vendor\mediatek\proprietary\packages\apps\Mms\ ...

Java學習-039-源碼 jar 包的二次開發擴充執行個體(源碼修改)

最近在使用已有的一些 jar 包時,發現有些 jar 包中的一些方法無法滿足自己的一些需求,例如傳回固定的格式,字元串處理等等,因而需要對原有 jar 檔案中對應的 class 檔案進行二次開發擴充, ...

python的paramiko源碼修改了一下,寫了個操作指令的日志審計 bug修改

python的paramiko源碼修改了一下,寫了個操作指令的日志審計,但是記錄的日志中也将backspace删除鍵記錄成^H這個了,于是改了一下代碼,用字元串的特性. 字元串具有清單的特性 > ...

Android6.0 源碼修改之 Contacts應用

一.Contacts應用的主界面和聯系人詳情界面增加頂部菜單添加退出按鈕 通過Hierarchy View 工具可以發現 主界面對應的類為 PeopleActivity 聯系人詳情界面對應的類為 Qu ...

Android6.0 源碼修改之 仿IOS添加全屏可拖拽浮窗傳回按鈕

前言 之前寫過屏蔽系統導航欄功能的文章,具體可看Android6.0 源碼修改之屏蔽導航欄虛拟按鍵(Home和RecentAPP)/動态顯示和隐藏NavigationBar 在某些特殊定制的版本中要求 ...

el-upload源碼修改跳坑

之前給element-ui提了一個問題,結果沒有鳥我,沒辦法,隻能修改源碼來滿足需求了 (備注:element-ui2依然沒有修改,為了迎合産品還是要改源碼) 本文讨論的元件屬性僅限于list-typ ...

openfire源碼修改後如何打包部署到linux伺服器上

原文:http://blog.csdn.net/jinzhencs/article/details/50457152 1.linux版本的3.10.3解壓部署啟動(過程略,參考我的另一篇博文http: ...

python requests接收chunked編碼問題-python源碼修改

python requests接收chunked編碼問題-python源碼修改 學習了:https://blog.csdn.net/wangzuxi/article/details/40377467

随機推薦

Nginx配置SSI

一.什麼是SSISSI:Server Side Include,是一種基于服務端的網頁制作技術,大多數(尤其是基于Unix平台)的web伺服器如Netscape Enterprise Server等均 ...

Delphi 能不能從Ring 3進入Ring 0

我發現了一篇發表在1999.11.29   b13版的     東南大學   盧威   [email protected]     是用vc++嵌彙編做的,    ...

使SSH不用輸入密碼

1. 自動ssh/scp方法== A為本地主機(即用于控制其他主機的機器) ;B為遠端主機(即被控制的機器Server), 假如ip為192.168.60.110;A和B的系統都是Linux 在A上運 ...

hdu3081 Marriage Match II

新年第一篇,又花了一早上,真是蠢啊! 二分+網絡流 之前對于讨論哪些人是朋友的時候複雜度過高 直接n3的暴力雖然看起來複雜度高,其實并不是每次都成立 #include

[SDOI2010] 魔法豬學院

Description 給定e和邊權,求有多少條不同的道路能從1到n使得邊權之和的和小于e Solution A*裸題 娘的要是SPFA再把dis寫成to就剁手 // By YoungNeal #in ...

Android使用SimpleAdapter

SimpleAdapter的使用步驟如下: 聲明ListView,并進行初始化操作 準備資料集,一般用list來實作,當然也可以使用數組 為listview适配simpleadapter 如下代碼: ...

初學mysql 那些記不住的指令

修改密碼: https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html MySQL 5.7.6 之後: ALTER USER ...

DJango 前三天小結

一 DJango 所有指令: 1下載下傳: 控制台:pip install django== ​pip install django== -i 源解釋器:找到解釋器,點選加号搜尋django 2建立項目; ...

基于PHP給大家講解防刷票的一些技巧

刷票行為,一直以來都是個難題,無法從根本上防止. 但是我們可以盡量減少刷票的傷害,比如:通過人為增加的邏輯限制. 基于 PHP,下面介紹防刷票的一些技巧: 1.使用CURL進行資訊僞造 $ch = c ...

提取日志中出現的userId或其他資訊

項目上線後經常出現需要統計使用者資料.接口請求等.完美的情況下,在項目開始前就設計好哪些request.中間過程需要落地到db.或以一定格式存入專門的log中,但也常需要同學們臨時去業務日志中grep ...