需求:在11.0的产品开发中,对于wifi的功能定制需求功能也是挺多的,目前对于wifi模块有这么个需求,要求在 提供接口实现删除已连接wifi的需求,所以需要了解wifi相关的配置情况,然后移除wifi即可
1.删除连接wifi的配置信息的相关代码
frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/BaseWifiService.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
2.删除连接wifi的配置信息的相关功能分析
删除wifi配置的实现方法
在wifi的相关aidl wifiservice的管理类等相关wifi模块提供需要删除wifi信息的接口,然后在 wifiManager这个 wifiManager核心类里面根据wifi的ssid来删除wifi断开连接
2.1IWifiManager.aidl增加wifi接口
IWifiManager.aidl增加移除wifi配置接口
--- a/frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -262,4 +262,7 @@ interface IWifiManagerboolean registerWifiRssiLinkSpeedAndFrequencyObserver(IWifiRssiLinkSpeedAndFrequencyObserver observer);boolean unregisterWifiRssiLinkSpeedAndFrequencyObserver(IWifiRssiLinkSpeedAndFrequencyObserver observer);//<-- Add for Wifi Rssi LinkSpeed And Frequency Observer
+ void removeWiFiConfiguration(String ssid);}
2.2 WifiManager.java里增加移除wifi配置相关信息
WifiManager是 Android 暴露给开发者使用的一个系统服务管理类,会调用service简介地和framework层, 驱动层进行函数调用, 然后驱动层会回调至上层, 以广播的形式实现通知
public class WifiManager {public WifiManager(@NonNull Context context, @NonNull IWifiManager service,@NonNull Looper looper) {mContext = context;mService = service;mLooper = looper;mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;updateVerboseLoggingEnabledFromService();}public List getConfiguredNetworks() {try {ParceledListSlice parceledList =mService.getConfiguredNetworks(mContext.getOpPackageName(),mContext.getAttributionTag());if (parceledList == null) {return Collections.emptyList();}return parceledList.getList();} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}/** @hide */@SystemApi@RequiresPermission(allOf = {ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE, READ_WIFI_CREDENTIAL})public List getPrivilegedConfiguredNetworks() {try {ParceledListSlice parceledList =mService.getPrivilegedConfiguredNetworks(mContext.getOpPackageName(),mContext.getAttributionTag());if (parceledList == null) {return Collections.emptyList();}return parceledList.getList();} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}
在 forgetNetwork(String ssid) 中根据ssid的类型调用wifimanager的.removePasspointConfiguration和forget的api来删除wifi配置
diff --git a/frameworks/base/wifi/java/android/net/wifi/WifiManager.java b/frameworks/base/wifi/java/android/net/wifi/WifiManager.java
index a55dbde9c0..4bdc586e9b 100755
--- a/frameworks/base/wifi/java/android/net/wifi/WifiManager.java
+++ b/frameworks/base/wifi/java/android/net/wifi/WifiManager.java
@@ -1764,7 +1764,28 @@ public class WifiManager {throw e.rethrowFromSystemServer();}}
+ public void removeWiFiConfiguration(String ssid){
+ try {
+ forgetNetwork(ssid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }public void forgetNetwork(String ssid) {if (TextUtils.isEmpty(ssid)) {return;}WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();WifiConfiguration mWifiConfig = IsExsits(ssid, mWifiManager);if (mWifiInfo != null && mWifiInfo.isEphemeral() && ssid.equals(mWifiInfo.getSSID())) {mWifiManager.disableEphemeralNetwork(mWifiInfo.getSSID());} else if (mWifiConfig != null) {if (mWifiConfig.isPasspoint()) {mWifiManager.removePasspointConfiguration(mWifiConfig.FQDN);} else {mWifiManager.forget(mWifiConfig.networkId, null);}} else {Log.e(TAG,"failed to forget ssid:" + ssid);}}
// 判断ssid是否存在private WifiConfiguration IsExsits(String SSID, WifiManager mWifiManager) {List existingConfigs = mWifiManager.getConfiguredNetworks();for (WifiConfiguration existingConfig : existingConfigs) {if (existingConfig.SSID.equals("\"" + SSID + "\"")) {return existingConfig;}}return null;}
2.3 BaseWifiService.java添加 Iwifimanager.aidl的接口实现
BaseWifiService的核心类主要承担wifi服务端binder通讯的角色,所以需要实现wifi的接口
diff --git a/frameworks/opt/net/wifi/service/java/com/android/server/wifi/BaseWifiService.java b/frameworks/opt/net/wifi/service/java/com/android/server/wifi/BaseWifiService.java
old mode 100644
new mode 100755
index 8ca3753b7b..d826f33a25
--- a/frameworks/base/wifi/java/com/android/server/wifi/BaseWifiService.java
+++ b/frameworks/base/wifi/java/com/android/server/wifi/BaseWifiService.java
@@ -565,4 +565,19 @@ public class BaseWifiService extends IWifiManager.Stub {throw new UnsupportedOperationException();}@Overridepublic void stopLocalOnlyHotspot() {throw new UnsupportedOperationException();}@Overridepublic void startWatchLocalOnlyHotspot(ILocalOnlyHotspotCallback callback) {throw new UnsupportedOperationException();}@Overridepublic void stopWatchLocalOnlyHotspot() {throw new UnsupportedOperationException();}@Overridepublic int getWifiApEnabledState() {throw new UnsupportedOperationException();}@Overridepublic WifiConfiguration getWifiApConfiguration() {throw new UnsupportedOperationException();}@Overridepublic SoftApConfiguration getSoftApConfiguration() {throw new UnsupportedOperationException();}@Overridepublic boolean setWifiApConfiguration(WifiConfiguration wifiConfig, String packageName) {throw new UnsupportedOperationException();}@Overridepublic boolean setSoftApConfiguration(SoftApConfiguration softApConfig, String packageName) {throw new UnsupportedOperationException();
+ @Override
+ public void removeWiFiConfiguration(String ssid){
+ throw new UnsupportedOperationException();
+
+ }}
上一篇:网络流与图(一)
下一篇:RTOS之二环境搭建初识RTOS