|
@@ -4,7 +4,9 @@ import android.Manifest;
|
|
|
import android.app.Activity;
|
|
|
import android.content.Context;
|
|
|
import android.content.pm.PackageManager;
|
|
|
+import android.net.ConnectivityManager;
|
|
|
import android.net.wifi.WifiConfiguration;
|
|
|
+import android.net.wifi.WifiInfo;
|
|
|
import android.net.wifi.WifiManager;
|
|
|
|
|
|
import androidx.core.app.ActivityCompat;
|
|
@@ -12,6 +14,7 @@ import androidx.core.app.ActivityCompat;
|
|
|
import java.lang.reflect.Constructor;
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.lang.reflect.Method;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
@@ -74,7 +77,7 @@ public class WifiProxyManager {
|
|
|
* @param wifiManager
|
|
|
* @return
|
|
|
*/
|
|
|
- public static WifiConfiguration getCurrentWifiConfiguration(WifiManager wifiManager, Context context) {
|
|
|
+ public static WifiConfiguration getCurrentWifiConfiguration(WifiManager wifiManager, Context context) throws Exception {
|
|
|
if (!wifiManager.isWifiEnabled())
|
|
|
return null;// 没有打开wifi
|
|
|
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
|
|
@@ -89,6 +92,9 @@ public class WifiProxyManager {
|
|
|
if (wifiConfiguration.networkId == cur)
|
|
|
configuration = wifiConfiguration;
|
|
|
}
|
|
|
+ if (configuration == null) {
|
|
|
+ throw new Exception("No current Wi-Fi configuration found.");
|
|
|
+ }
|
|
|
return configuration;
|
|
|
}
|
|
|
|
|
@@ -101,36 +107,34 @@ public class WifiProxyManager {
|
|
|
* @param exclList 添加不用代理的网址
|
|
|
*/
|
|
|
public static void setWifiProxySettingsFor17And(Context context, String host, int port, String exclList) {
|
|
|
- WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
|
|
- WifiConfiguration config = getCurrentWifiConfiguration(wifiManager, context);
|
|
|
- if (config == null)
|
|
|
- return;
|
|
|
try {
|
|
|
- Object linkProperties = getDeclaredFieldObject(config, "linkProperties");
|
|
|
- if (null == linkProperties)
|
|
|
- return;
|
|
|
- // 获取类 LinkProperties的setHttpProxy方法
|
|
|
- Class<?> proxyPropertiesClass = Class.forName("android.net.ProxyProperties");
|
|
|
- Class<?>[] setHttpProxyParams = new Class[1];
|
|
|
- setHttpProxyParams[0] = proxyPropertiesClass;
|
|
|
- Class<?> lpClass = Class.forName("android.net.LinkProperties");
|
|
|
- Method setHttpProxy = lpClass.getDeclaredMethod("setHttpProxy", setHttpProxyParams);
|
|
|
- setHttpProxy.setAccessible(true);
|
|
|
- // 获取类 ProxyProperties的构造函数
|
|
|
- Constructor<?> proxyPropertiesCtor = proxyPropertiesClass.getConstructor(String.class, int.class,
|
|
|
- String.class);
|
|
|
- // 实例化类ProxyProperties
|
|
|
- proxySettings = proxyPropertiesCtor.newInstance(host, port, exclList);
|
|
|
- Object[] params = new Object[1];
|
|
|
- params[0] = proxySettings;
|
|
|
- setHttpProxy.invoke(linkProperties, params);
|
|
|
- setEnumField(config, "STATIC", "proxySettings");
|
|
|
- // save the settings
|
|
|
- wifiManager.updateNetwork(config);
|
|
|
- wifiManager.disconnect();
|
|
|
- wifiManager.reconnect();
|
|
|
- } catch (Exception e) {
|
|
|
+ WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
|
|
+ WifiConfiguration currentConfig = getCurrentWifiConfiguration(wifiManager, context);
|
|
|
+
|
|
|
+ // Access the proxy settings field
|
|
|
+ Class<?> proxySettingsClass = Class.forName("android.net.IpConfiguration$ProxySettings");
|
|
|
+ Field proxySettingsField = WifiConfiguration.class.getField("proxySettings");
|
|
|
+ Method setProxyMethod = proxySettingsClass.getDeclaredMethod("valueOf", String.class);
|
|
|
+
|
|
|
+ // Set proxy settings to STATIC
|
|
|
+ Object staticProxySettings = setProxyMethod.invoke(null, "STATIC");
|
|
|
+ proxySettingsField.set(currentConfig, staticProxySettings);
|
|
|
|
|
|
+ // Access and set the proxy info
|
|
|
+ Class<?> proxyInfoClass = Class.forName("android.net.ProxyInfo");
|
|
|
+ Method buildDirectProxy = proxyInfoClass.getDeclaredMethod("buildDirectProxy", String.class, int.class, List.class);
|
|
|
+ Object proxyInfo = buildDirectProxy.invoke(null, host, port, exclList != null ? Arrays.asList(exclList.split(",")) : null);
|
|
|
+
|
|
|
+ Field httpProxyField = WifiConfiguration.class.getField("httpProxy");
|
|
|
+ httpProxyField.set(currentConfig, proxyInfo);
|
|
|
+
|
|
|
+ // Update the configuration
|
|
|
+ wifiManager.updateNetwork(currentConfig);
|
|
|
+ wifiManager.saveConfiguration();
|
|
|
+ // wifiManager.disconnect();
|
|
|
+ // wifiManager.reconnect();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -139,7 +143,7 @@ public class WifiProxyManager {
|
|
|
*
|
|
|
* @param context
|
|
|
*/
|
|
|
- public static void unsetWifiProxySettingsFor17And(Context context) {
|
|
|
+ public static void unsetWifiProxySettingsFor17And(Context context) throws Exception {
|
|
|
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
|
|
WifiConfiguration config = getCurrentWifiConfiguration(wifiManager, context);
|
|
|
if (null == config)
|