Android 9.0之前版本修改如下

//frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.javaloadSetting(stmt, Settings.Global.ENHANCED_4G_MODE_ENABLED, ImsConfig.FeatureValueConstants.OFF);

设置 ENHANCED_4G_MODE_ENABLED 为 ON/OFF 即可

Android 9.0及之后版本

DatabaseHelper.java 中设置项已经取消,修改如下

//frameworks\base\telephony\java\android\telephony\CarrierConfigManager.javasDefaults.putBoolean(KEY_HIDE_ENHANCED_4G_LTE_BOOL, true);
sDefaults.putBoolean(KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL, false);

KEY_HIDE_ENHANCED_4G_LTE_BOOL 设置是否隐藏VoLTE开关;

KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL  设置VoLTE模式默认值。

MTK 平台代码修改

MTK增加了 ImsService 管理 IMS 相关服务,在开机或者是热插拔时,从modem侧获取 SIM 内数据后,会同步 SIM 自身保存内容到系统,如下:

//vendor/mediatek/proprietary/packages/services/Ims/src/com/mediatek/ims/ImsService.java/***Ims service Message hanadler.*@hide*/private class MyHandler extends Handler {... ...@Overridepublic void handleMessage(Message msg) {AsyncResult ar;Intent intent;switch (msg.what) {... .../// M: Sync volte setting value. @{case EVENT_IMS_VOLTE_SETTING_URC:/*ar = (AsyncResult) msg.obj;boolean enable = ((int[]) ar.result)[0] == 1;int simState = SubscriptionManager.getSimStateForSlotIndex(mSocketId);if (simState == TelephonyManager.SIM_STATE_ABSENT|| (getSubIdUsingPhoneId(mSocketId)<= SubscriptionManager.INVALID_SUBSCRIPTION_ID)) {if (mRegisterSubInfoChange == false) {final IntentFilter filter = new IntentFilter();filter.addAction(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED);mContext.registerReceiver(mSubInfoReceiver, filter);mRegisterSubInfoChange = true;}mWaitSubInfoChange[mSocketId] = true;} else {mWaitSubInfoChange[mSocketId] = false;}mVolteEnable[mSocketId] = enable;if (mWaitFeatureChange == 0) {SystemProperties.set(PROPERTY_IMSCONFIG_FORCE_NOTIFY, "1");IntentFilter filter = new IntentFilter();filter.addAction(ImsConfig.ACTION_IMS_FEATURE_CHANGED);mContext.registerReceiver(mFeatureValueReceiver, filter);}mWaitFeatureChange = mWaitFeatureChange | (1 << mSocketId);setEnhanced4gLteModeSetting(mSocketId, enable);log("handleMessage() : Volte_Setting_Enable=" + enable +", register:" + mWaitSubInfoChange[mSocketId] +", mWaitFeatureChange:" + mWaitFeatureChange);*/break;/// @}... ...}

需要将 EVENT_IMS_VOLTE_SETTING_URC 这部分移除,避免将 SIM 内保存的数据设置到机器中。

题外话:VoLTE 模式的设置及状态获取通过 MtkImsManager.java 的接口获取。

//vendor/mediatek/proprietary/frameworks/opt/net/ims/src/java/com/mediatek/ims/internal/MtkImsManager.java@Overridepublic boolean isEnhanced4gLteModeSettingEnabledByUser() {int sub = getSubId();int setting = SubscriptionManager.getIntegerSubscriptionProperty(sub, SubscriptionManager.ENHANCED_4G_MODE_ENABLED,SUB_PROPERTY_NOT_INITIALIZED, mContext);boolean onByDefault = getBooleanCarrierConfig(CarrierConfigManager.KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL);boolean isPSsupport = isPhoneIdSupportIms(mPhoneId);// If sim not ready yet, default offif (sub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {onByDefault = false;}// If Enhanced 4G LTE Mode is uneditable or not initialized, we use the default valueif (!getBooleanCarrierConfig(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL)|| setting == SUB_PROPERTY_NOT_INITIALIZED) {if (onByDefault) {// For CT roaming case or dual mode card, it's mccmnc maybe 20404,// carrier config volte value is not consist to CT request.String iccid = SystemProperties.get(PROPERTY_ICCID_SIM[mPhoneId],"N/A");if (!TextUtils.isEmpty(iccid) && isOp09SimCard(iccid)) {onByDefault = false;log("volte_setting, Replace volte value for CT card case");}}return onByDefault;} else {return (setting == ImsConfig.FeatureValueConstants.ON) && isPSsupport;}}/*** @param context* @param enabled* @param phoneId*/public static void setEnhanced4gLteModeSetting(Context context,boolean enabled, int phoneId) {if (!isSupportMims()) {phoneId = getMainPhoneIdForSingleIms(context);}getAppropriateManagerForPlugin(context, phoneId).setEnhanced4gLteModeSetting(enabled);}

这里最终还是调用的系统原生类 SubscriptionManager.java 去获取管理。SubscriptionManager 是 SubscriptionController 的应用程序接口了,通过binder跨进程去 SubscriptionController 中继续执行。SubscriptionController运行在phone进程中,为 SIM 卡相关功能服务。

        try {ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));if (iSub != null) {subInfo = iSub.getActiveSubscriptionInfo(subId, mContext.getOpPackageName());}} catch (RemoteException ex) {// ignore it}

SubscriptionController 包含了通过 getContentResolver 查询修改 telephony 数据库操作,telephony 数据库则由 TelephonyProvider.java 去创建,保存包括 siminfo 和 carriers 等表,记录 SIM 信息和 APN 信息等。数据库路径:data/user_de/0/com.android.providers.telephony/

Android 修改SIM卡默认VOLTE值相关推荐

  1. Android默认电话卡,Android智能终端SIM卡自动切换方法与流程

    本发明涉及智能终端的技术领域,尤其涉及一种SIM卡的切换方法. 背景技术: 现在的手机等机器基本支持多卡配置,而且现在单卡配置基本已经不能满足人们的日常需求:并且在智能系统的潮流之下,有人喜欢用手机看 ...

  2. android 语言随sim变,如何修改Sim卡语言自适应

    1.如何修改Sim卡语言自适应 一.系统设定默认语言规则 1. 系统预置语言,即在 makefile 文件中定义的语言: – 位置:mediatek/config/${Project}/Project ...

  3. Android代码修改SIM的PIN码,中兴U970如何修改SIM卡或UIM卡的PIN码

    中兴U970修改SIM卡或UIM卡的PIN码方法:选择设置>安全>设置SIM/UIM卡锁定>更改SIM/UIM卡PIN. 中兴U970拥有一块4.3英寸的qHD高清屏幕,分辨率也是达 ...

  4. android 获取sim卡operator

    android 获取sim卡运营商信息 TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHO ...

  5. Android实现SIM卡2拨打,从第二个SIM卡打电话(Call from second sim)

    我有一个双卡Android手机. 我使用此代码来拨打电话: private void callBack(String phone, Context context) { Intent callInte ...

  6. Android 获取SIM卡信息

    android 获取sim卡运营商信息 TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHO ...

  7. Android 系统(260)---Android 读取SIM卡参数

    Android 读取SIM卡参数 package com.water.activity; import java.util.List; import android.app.Activity; imp ...

  8. android sim卡分析,Android 判断SIM卡属于哪个移动运营商详解及实例

    Android 判断SIM卡属于哪个移动运营商 第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (Telephon ...

  9. php 判断联通移动电信,Android 判断SIM卡是中国移动\中国联通\中国电信(移动运营商)...

    第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (TelephonyManager) getSystemServi ...

最新文章

  1. jradiobutton设置默认选项_JRadioButton(单选按钮)添加事件监听
  2. 网络Socket,ServerSocket
  3. P359 usestock2.cpp
  4. python循环输出三角形图案的画_python循环输出三角形图案的例子
  5. [渝粤教育] 广东-国家-开放大学21秋期末考试中国近现代史纲要(A)10881k1
  6. 挑战程序设计竞赛 (秋叶拓哉 / 岩田阳一 / 北川宜稔 著)
  7. python转义引号的作用_python传到前端的数据,双引号被转义的问题
  8. HTML极客自适应网址导航模板,更换背景+看板娘
  9. java,list集合类
  10. Java8 - Stream API快速入门
  11. java关于map用来筛选的用法
  12. 非好友怎么进qq权限空间
  13. TortoiseSVN常见用法
  14. 道德经 全文 简体字 繁体字_电脑的各种程序由 0 1 组成,就如同道德经中所说的(道生一。一生二。二生三。三生萬物)
  15. Android NFC M1卡读写芯片卡读写(CPU卡读写)(RFID读写)
  16. B75对应的服务器芯片组,H77及B75芯片组解析
  17. java使用ffmpeg将视频转码
  18. H7N9?生活还得继续~~适合边玩边学的HTML5五彩连珠游戏 1
  19. HTML+CSS练习案例
  20. 此版本的 Windows 不再支持 Microsoft Edge

热门文章

  1. Client引入Eureka报Completed shut down of DiscoveryClient问题原因及解决方式
  2. 人体生物钟,24小时器官工作表
  3. 【Android应用开发】-(16)如何绕开Google Play地区限制
  4. Elasticsearch Compound queries 学习总结
  5. [JVM]了断局: 堆外内存无法 [ -XX:MaxDirectMemorySize ] 限制
  6. 子空间高斯混合模型-SGMM
  7. Vivado HLS 入门实验
  8. SAS小白入门第二节:SAS数据类型和格式化(输入和输出)
  9. 第二章第二十二题(金融应用:货币单位)(Financial application: monetary units)
  10. 3 个月前被裁员了,心情跌落谷底,直到我看到了这本神书…