由于我们需要使用NLP定位,那肯定是需要打开 Wlan 扫描的。所以需要默认打开,那代码路径在哪呢?
首先我们可以通过 packages/apps/Settings/res/xml/location_services.xml 里面找到界面:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="location_services"
android:title="@string/location_services_preference_title" ---> 位置信息服务
settings:controller="com.android.settings.location.LocationInjectedServicesPreferenceController">
<com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.location.WifiScanningFragment"
android:order="1000"
android:key="location_services_wifi_scanning"
android:title="@string/location_scanning_wifi_always_scanning_title" ---> WLAN 扫描
settings:controller="com.android.settings.location.LocationServicesWifiScanningPreferenceController"/>
<com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.location.BluetoothScanningFragment"
android:order="1001"
android:key="location_services_bluetooth_scanning"
android:title="@string/location_scanning_bluetooth_always_scanning_title"
settings:controller="com.android.settings.location.LocationServicesBluetoothScanningPreferenceController"/>
</PreferenceScreen>
这里我们只看 “WLAN 扫描”,看 WifiScanningFragment,在这里又 new WifiScanningPreferenceController
http://aospxref.com/android-13.0.0_r3/xref/packages/apps/Settings/src/com/android/settings/location/
WifiScanningPreferenceController.java#updateState
@Override
public void updateState(Preference preference) {
((SwitchPreference) preference).setChecked(mWifiManager.isScanAlwaysAvailable());
}
重点看 WifiManager.isScanAlwaysAvailable() 即可,直接看这个里,代码调用就省略了:
http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java#2775
public boolean isScanAlwaysAvailable() {
enforceAccessPermission();
if (isVerboseLoggingEnabled()) {
mLog.info("isScanAlwaysAvailable uid=%").c(Binder.getCallingUid()).flush();
}
return mSettingsStore.isScanAlwaysAvailableToggleEnabled();
}
//packages/modules/Wifi/service/java/com/android/server/wifi/WifiSettingsStore.java
public synchronized boolean isScanAlwaysAvailableToggleEnabled() {
return getPersistedScanAlwaysAvailable();
}
private boolean getPersistedScanAlwaysAvailable() {
return mSettingsConfigStore.get(WifiSettingsConfigStore.WIFI_SCAN_ALWAYS_AVAILABLE);
}
看下 WifiSettingsConfigStore.WIFI_SCAN_ALWAYS_AVAILABLE 是啥:
http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Wifi/service/java/com/android/server/wifi/WifiSettingsConfigStore.java#64
public static final Key<Boolean> WIFI_SCAN_ALWAYS_AVAILABLE = new Key<>("wifi_scan_always_enabled", false);
public static class Key<T> {
public final String key;
public final T defaultValue;
private Key(@NonNull String key, T defaultValue) {
this.key = key;
this.defaultValue = defaultValue;
sKeys.add(this);
}
}
// mSettingsConfigStore.get(Key)
private final Map<String, Object> mSettings = new HashMap<>();
public @Nullable <T> T get(@NonNull Key<T> key) {
synchronized (mLock) {
return (T) mSettings.getOrDefault(key.key, key.defaultValue); ---> 如果key不存在对应的关系,则返回defaultValue
}
}
那我们现在知道了 Map 的 getOrDefault用法后就需要确认下代码里存不存在Key的对应关系
getOrDefault 使用的小例子,可以看:https://www.runoob.com/java/java-hashmap-getordefault.html
Ok,那现在我们只需要确认代码里有没有Key的对应关系,如果没有,那修改defaultValue就可以了。
代码搜下,发现有这样的对应关系:
mSettings.put(WIFI_SCAN_ALWAYS_AVAILABLE.key, mCachedMigrationData.isScanAlwaysAvailable());
而 mCachedMigrationData 对应关系如下:
mCachedMigrationData = mSettingsMigrationDataHolder.retrieveData();
mSettingsMigrationDataHolder = settingsMigrationDataHolder;
追代码省略,最终可以发现是数据库操作
SettingsMigrationData data = new SettingsMigrationData.Builder()
.setScanAlwaysAvailable(
Settings.Global.getInt(context.getContentResolver(), Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1)
那只要找到初始化这个 Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE 地方即可,看圈出来的两个地方即可,defaults.xml是放默认值的地方,DatabaseHelper是加载的defaults.xml里面的 def_wifi_scan_always_available值的地方。
也就是我们直接修改 defaults.xml 里面对应的值即可:
http://aospxref.com/android-13.0.0_r3/xref/frameworks/base/packages/SettingsProvider/res/values/defaults.xml#159
<!-- Default for Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE -->
<integer name="def_wifi_scan_always_available">0</integer>