Android(安卓)8.1 设置中首选网络类型缺少LTE
16lz
2022-05-18
平台
RK3399 + Android 8.1
问题:
设置 > 更多 > 移动网络 > 首选网络类型 选项中, 仅显示 3G和2G, 缺少LTE, 本身模块与SIM卡是支持LTE的.
相关代码:
|-- packages/services/Telephony/res/xml/network_setting_fragment.xml
<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/mobile_networks"> <PreferenceScreen android:key="cdma_lte_data_service_key" android:title="@string/cdma_lte_data_service"> PreferenceScreen> <com.android.phone.MobileDataPreference android:key="mobile_data_enable" android:title="@string/mobile_data_settings_title" android:summary="@string/mobile_data_settings_summary"/> <com.android.phone.RestrictedSwitchPreference android:key="button_roaming_key" android:title="@string/roaming" android:persistent="false" android:summaryOn="@string/roaming_enable" android:summaryOff="@string/roaming_disable"/> <com.android.phone.DataUsagePreference android:key="data_usage_summary" android:title="@string/data_usage_title" /> <com.android.phone.AdvancedOptionsPreference android:key="advanced_options"/> <SwitchPreference android:key="enhanced_4g_lte" android:title="@string/enhanced_4g_lte_mode_title" android:persistent="false" android:summary="@string/enhanced_4g_lte_mode_summary"/> <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" /> <Preference android:key="carrier_settings_euicc_key" android:title="@string/carrier_settings_euicc" /> <PreferenceCategory android:key="calling" android:title="@string/call_category"> <PreferenceScreen android:key="wifi_calling_key" android:title="@string/wifi_calling_settings_title"> <intent android:action="android.intent.action.MAIN" android:targetPackage="com.android.settings" android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity"> <extra android:name="show_drawer_menu" android:value="true" /> intent> PreferenceScreen> <SwitchPreference android:key="video_calling_key" android:title="@string/video_calling_settings_title" android:persistent="true"/> PreferenceCategory>PreferenceScreen>
|-- packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java
public class MobileNetworkSettings extends Activity { public static class MobileNetworkFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, RoamingDialogFragment.RoamingDialogListener { private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key"; @Override public void onCreate(Bundle icicle) { Log.i(LOG_TAG, "onCreate:+"); super.onCreate(icicle);...//添加设置项 addPreferencesFromResource(R.xml.network_setting_fragment); mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference( BUTTON_PREFERED_NETWORK_MODE);} private void updateBodyAdvancedFields(Activity activity, PreferenceScreen prefSet, int phoneSubId, boolean hasActiveSubscriptions) { boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE; if (DBG) { log("updateBody: isLteOnCdma=" + isLteOnCdma + " phoneSubId=" + phoneSubId); } prefSet.addPreference(mButtonPreferredNetworkMode); prefSet.addPreference(mButtonEnabledNetworks); prefSet.addPreference(mButton4glte); if (showEuiccSettings(getActivity())) { prefSet.addPreference(mEuiccSettingsPref); String spn = mTelephonyManager.getSimOperatorName(); if (TextUtils.isEmpty(spn)) { mEuiccSettingsPref.setSummary(null); } else { mEuiccSettingsPref.setSummary(spn); } } int settingsNetworkMode = android.provider.Settings.Global.getInt( mPhone.getContext().getContentResolver(), android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, preferredNetworkMode); PersistableBundle carrierConfig = PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId()); mIsGlobalCdma = isLteOnCdma && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL); if (carrierConfig.getBoolean( CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) { prefSet.removePreference(mButtonPreferredNetworkMode); prefSet.removePreference(mButtonEnabledNetworks); prefSet.removePreference(mLteDataServicePref); } else if (carrierConfig.getBoolean(CarrierConfigManager .KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL) && !mPhone.getServiceState().getRoaming() && mPhone.getServiceState().getDataRegState() == ServiceState.STATE_IN_SERVICE) { prefSet.removePreference(mButtonPreferredNetworkMode); prefSet.removePreference(mButtonEnabledNetworks); final int phoneType = mPhone.getPhoneType(); if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { updateCdmaOptions(this, prefSet, mPhone); } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService); } else { throw new IllegalStateException("Unexpected phone type: " + phoneType); } // Since pref is being hidden from user, set network mode to default // in case it is currently something else. That is possible if user // changed the setting while roaming and is now back to home network. settingsNetworkMode = preferredNetworkMode; } else if (carrierConfig.getBoolean( CarrierConfigManager.KEY_WORLD_PHONE_BOOL) == true) { prefSet.removePreference(mButtonEnabledNetworks); // set the listener for the mButtonPreferredNetworkMode list preference so we can issue // change Preferred Network Mode. mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this); updateCdmaOptions(this, prefSet, mPhone); updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService); } else { prefSet.removePreference(mButtonPreferredNetworkMode); final int phoneType = mPhone.getPhoneType(); if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { int lteForced = android.provider.Settings.Global.getInt( mPhone.getContext().getContentResolver(), android.provider.Settings.Global.LTE_SERVICE_FORCED + mPhone.getSubId(), 0); if (isLteOnCdma) { if (lteForced == 0) { mButtonEnabledNetworks.setEntries( R.array.enabled_networks_cdma_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_cdma_values); } else { switch (settingsNetworkMode) { case Phone.NT_MODE_CDMA: case Phone.NT_MODE_CDMA_NO_EVDO: case Phone.NT_MODE_EVDO_NO_CDMA: mButtonEnabledNetworks.setEntries( R.array.enabled_networks_cdma_no_lte_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_cdma_no_lte_values); break; case Phone.NT_MODE_GLOBAL: case Phone.NT_MODE_LTE_CDMA_AND_EVDO: case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: case Phone.NT_MODE_LTE_ONLY: mButtonEnabledNetworks.setEntries( R.array.enabled_networks_cdma_only_lte_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_cdma_only_lte_values); break; default: mButtonEnabledNetworks.setEntries( R.array.enabled_networks_cdma_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_cdma_values); break; } } } updateCdmaOptions(this, prefSet, mPhone); } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { if (isSupportTdscdma()) { mButtonEnabledNetworks.setEntries( R.array.enabled_networks_tdscdma_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_tdscdma_values); } else if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL) && !getResources().getBoolean(R.bool.config_enabled_lte)) { mButtonEnabledNetworks.setEntries( R.array.enabled_networks_except_gsm_lte_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_except_gsm_lte_values); } else if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) { int select = (mShow4GForLTE == true) ? R.array.enabled_networks_except_gsm_4g_choices : R.array.enabled_networks_except_gsm_choices; mButtonEnabledNetworks.setEntries(select); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_except_gsm_values); } else if (!getResources().getBoolean(R.bool.config_enabled_lte)) {//运行此分支 mButtonEnabledNetworks.setEntries( R.array.enabled_networks_except_lte_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_except_lte_values); } else if (mIsGlobalCdma) { mButtonEnabledNetworks.setEntries( R.array.enabled_networks_cdma_choices); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_cdma_values); } else { int select = (mShow4GForLTE == true) ? R.array.enabled_networks_4g_choices : R.array.enabled_networks_choices; mButtonEnabledNetworks.setEntries(select); mButtonEnabledNetworks.setEntryValues( R.array.enabled_networks_values); } updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService); } else { throw new IllegalStateException("Unexpected phone type: " + phoneType); } if (isWorldMode()) { mButtonEnabledNetworks.setEntries( R.array.preferred_network_mode_choices_world_mode); mButtonEnabledNetworks.setEntryValues( R.array.preferred_network_mode_values_world_mode); } mButtonEnabledNetworks.setOnPreferenceChangeListener(this); if (DBG) log("settingsNetworkMode: " + settingsNetworkMode); }
|-- packages/services/Telephony/res/values/strings.xml
<string-array name="enabled_networks_except_lte_choices" translatable="false"> <item>@string/network_3Gitem> <item>@string/network_2Gitem> string-array>
config_enabled_lte的值为:
|-- packages/services/Telephony/res/values/config.xml
<bool name="config_enabled_lte" translatable="false">falsebool>
在以往的代码(以下为RK3288 Android7.1)中, 此值为true:
|-- device/rockchip/common/overlay/packages/services/Telephony/res/values/config.xml
<bool name="config_enabled_lte" translatable="false">truebool>
因此, 只需把 config_enabled_lte的值改为true即可显示出LTE.
更多相关文章
- 如何让Android字体自适应屏幕分辨率
- 关于设置activity样式
- android:windowSoftInputMode属性使用
- Android(安卓)用Shell命令设置静态ip
- Android(安卓)程序获取、设置铃声、音量、静音、扬声器
- Android:实现一种浮动选择菜单的效果
- Android(安卓)网络链接状态 网络是否可用
- EditText的光标选择(android.text.Selection)&输入指定字符
- Android实现系统下拉栏的消息提示——Notification