默认打开Wlan扫描

11 篇文章 4 订阅

  由于我们需要使用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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值