Browse Source

modify proxy set

lqg 1 year ago
parent
commit
18b263aeb3

+ 3 - 1
app/src/main/AndroidManifest.xml

@@ -4,13 +4,15 @@
 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
 
-
     <application
         android:allowBackup="true"
+        android:name=".MyApp"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@drawable/ic_launcher"

+ 12 - 13
app/src/main/java/io/github/jianboy/wifiproxy/MainActivity.java

@@ -5,7 +5,6 @@ import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
-import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
@@ -21,7 +20,7 @@ import io.github.jianboy.wifiproxy.utils.WifiProxyManager;
 
 public class MainActivity extends AppCompatActivity {
     Context mContext;
-    Button btn1;
+    Button btnSetProxy;
     EditText edt_host, edt_port;
     SharedPreferences sharedPreferences;
 
@@ -40,9 +39,9 @@ public class MainActivity extends AppCompatActivity {
     }
 
     private void initView() {
-        btn1 = (Button) findViewById(R.id.button1);
-        edt_host = (EditText) findViewById(R.id.edt_host);
-        edt_port = (EditText) findViewById(R.id.edt_port);
+        btnSetProxy = findViewById(R.id.button1);
+        edt_host = findViewById(R.id.edt_host);
+        edt_port = findViewById(R.id.edt_port);
 
         // 恢复设置
         sharedPreferences = mContext.getSharedPreferences("setting", Context.MODE_PRIVATE);
@@ -51,11 +50,11 @@ public class MainActivity extends AppCompatActivity {
         edt_host.setText(host);
         edt_port.setText(port);
 
-        btn1.setOnClickListener(new View.OnClickListener() {
-
-            @Override
-            public void onClick(View v) {
+        btnSetProxy.setOnClickListener(v -> {
+            try {
                 setWifiProxy();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
             }
         });
     }
@@ -63,16 +62,16 @@ public class MainActivity extends AppCompatActivity {
     /**
      * 设置wifi代理
      */
-    private void setWifiProxy() {
+    private void setWifiProxy() throws Exception {
 
-        if (btn1.getText().toString().equals(R.string.set_wifi_proxy)) {
+        if (btnSetProxy.getText().toString().equals(getString(R.string.set_wifi_proxy))) {
             WifiProxyManager.setWifiProxySettingsFor17And(mContext, edt_host.getText().toString().trim(),
                     Integer.parseInt(edt_port.getText().toString().trim()), null);
             Toast.makeText(mContext, "设置成功!", Toast.LENGTH_SHORT).show();
-            btn1.setText(R.string.cancel_wifi_proxy);
+            btnSetProxy.setText(R.string.cancel_wifi_proxy);
         } else {
             WifiProxyManager.unsetWifiProxySettingsFor17And(mContext);
-            btn1.setText(R.string.set_wifi_proxy);
+            btnSetProxy.setText(R.string.set_wifi_proxy);
         }
         saveConfig();
     }

+ 34 - 30
app/src/main/java/io/github/jianboy/wifiproxy/utils/WifiProxyManager.java

@@ -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)