赞
踩
本博文记录寻找手机热点中AP Band(频段)被隐藏/置灰的原因,相似问题同理去查找解决。
先放上一张MTK平台手机-热点-AP Band界面效果图:
很明显,界面中的AP Band选项变灰,无法点击编辑修改内容,如果是AP Band 被隐藏或者其他选项(Hotspot password。。。)也被置灰或隐藏也是一样的步骤去寻找原因解决问题。
grep -r "AP Band"
运行查找命令与运行结果如图:
3. 所以找到了AP Band 选项控制源码文件的位置:
\packages\apps\Car\Settings\src\com\android\car\settings\wifi\WifiTetherApBandPreferenceController.java
代码不算多,但直接看这个结构会比较省事:
——包-- com.android.car.settings.wifi
——类--WifiTetherApBandPreferenceController
——方法-- validateSelection(int band)---验证选择
updatePreferenceEntries--更新首选项-
updateApBand()---更新接入点频段
getBandEntry()---获取频段条目
is5GhzBandSupported() ---支持is5Ghz频段
。。。。。。
WifiTetherApBandPreferenceController.java代码内容如下:(选择性看)
package com.android.car.settings.wifi; import android.car.drivingstate.CarUxRestrictions; import android.content.Context; import android.content.res.Resources; import android.net.wifi.SoftApConfiguration; import android.util.Log; import androidx.preference.ListPreference; import com.android.car.settings.R; import com.android.car.settings.common.FragmentController; /** * Controls WiFi Hotspot AP Band configuration. */ public class WifiTetherApBandPreferenceController extends WifiTetherBasePreferenceController<ListPreference> { private static final String TAG = "CarWifiTetherApBandPref"; private String[] mBandEntries; private String[] mBandSummaries; private int mBand; public WifiTetherApBandPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); } @Override protected Class<ListPreference> getPreferenceType() { return ListPreference.class; } @Override protected void onCreateInternal() { super.onCreateInternal(); updatePreferenceEntries(); getPreference().setEntries(mBandSummaries); getPreference().setEntryValues(mBandEntries); } @Override public void updateState(ListPreference preference) { super.updateState(preference); SoftApConfiguration config = getCarSoftApConfig(); if (config == null) { mBand = SoftApConfiguration.BAND_2GHZ; } else if (!is5GhzBandSupported() && config.getBand() == SoftApConfiguration.BAND_5GHZ) { SoftApConfiguration newConfig = new SoftApConfiguration.Builder(config) .setBand(SoftApConfiguration.BAND_2GHZ) .build(); setCarSoftApConfig(newConfig); mBand = newConfig.getBand(); } else { mBand = validateSelection(config.getBand()); } if (!is5GhzBandSupported()) { preference.setEnabled(false); preference.setSummary(R.string.wifi_ap_choose_2G); } else { preference.setValue(Integer.toString(config.getBand())); preference.setSummary(getSummary()); } } @Override protected String getSummary() { if (!is5GhzBandSupported()) { return getContext().getString(R.string.wifi_ap_choose_2G); } switch (mBand) { case SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ: return getContext().getString(R.string.wifi_ap_prefer_5G); case SoftApConfiguration.BAND_2GHZ: return mBandSummaries[0]; case SoftApConfiguration.BAND_5GHZ: return mBandSummaries[1]; default: Log.e(TAG, "Unknown band: " + mBand); return getContext().getString(R.string.wifi_ap_prefer_5G); } } @Override protected String getDefaultSummary() { return null; } @Override public boolean handlePreferenceChanged(ListPreference preference, Object newValue) { mBand = validateSelection(Integer.parseInt((String) newValue)); updateApBand(); // updating AP band because mBandIndex may have been assigned a new value. refreshUi(); return true; } private int validateSelection(int band) { // unsupported states: // 1: BAND_5GHZ only - include 2GHZ since some of countries doesn't support 5G hotspot // 2: no 5 GHZ support means we can't have BAND_5GHZ - default to 2GHZ if (SoftApConfiguration.BAND_5GHZ == band) { if (!is5GhzBandSupported()) { return SoftApConfiguration.BAND_2GHZ; } return SoftApConfiguration.BAND_5GHZ | SoftApConfiguration.BAND_2GHZ; } return band; } private void updatePreferenceEntries{ Resources res = getContext().getResources(); int entriesRes = R.array.wifi_ap_band; int summariesRes = R.array.wifi_ap_band_summary; mBandEntries = res.getStringArray(entriesRes); mBandSummaries = res.getStringArray(summariesRes); } private void updateApBand() { SoftApConfiguration config = new SoftApConfiguration.Builder(getCarSoftApConfig()) .setBand(mBand) .build(); setCarSoftApConfig(config); getPreference().setValue(getBandEntry()); } private String getBandEntry() { switch (mBand) { case SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ: case SoftApConfiguration.BAND_2GHZ: return mBandEntries[0]; case SoftApConfiguration.BAND_5GHZ: return mBandEntries[1]; default: Log.e(TAG, "Unknown band: " + mBand + ", defaulting to 2GHz"); return mBandEntries[0]; } } private boolean is5GhzBandSupported() { String countryCode = getCarWifiManager().getCountryCode(); return getCarWifiManager().is5GhzBandSupported() && countryCode != null; } }
在上面的代码中,分析每个方法的具体作用以及是如何调用的,
发现:方法is5GhzBandSupported()在updateState()方法里被调用:
if (!is5GhzBandSupported()) {
preference.setEnabled(false);
preference.setSummary(R.string.wifi_ap_choose_2G);
}
里面的 preference.setEnabled(false); setEnabled是使能控件
由此可以分析
原因: 需要禁用并置灰preference时,调用mPreference.setEnable(false)
我们的AP Band 选项变灰是因为这里的条件判断语句:不支持5GHz时设置使能控件值为false选项被禁用了。
设置为false,该控件永远不会活动,不管设置为什么属性,都无效;
设置为true,表明激活该控件,控件处于活动状态,处于活动状态,就能响应事件了,比如触摸、点击、按键事件等;
setEnabled就相当于总开关一样,只有总开关打开了,才能使用其他事件。
同样的方法先找到AP Band的位置,对源码进行分析理解,其中隐藏Preference有两种方法
一、先在xml布局里面删,然后在java里面删掉调用的相关部分,但如果很多地方都有调用,那么删除就很麻烦;
二、用removePreference(Preference preference) 方法 删除;(推荐方法)
我这里就不再赘述,直接放上几个相关内容其他开发者的博文链接以供查阅:
Android——Preference详解之Preference系的基本应用和管理(二)
Android APP:Preference使用详解和实例(附源码)
这个内容也是比较琐碎,放上几个学习查阅链接:
Java中的关键字有哪些?「Java中53个关键字的意义及使用方法」
Java 关键字—w3schools
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。