liuyuqi-dellpc 5 years ago
parent
commit
4dbdbd0556

+ 5 - 1
AndroidManifest.xml

@@ -8,6 +8,10 @@
         android:minSdkVersion="8"
         android:targetSdkVersion="21" />
 
+    <uses-permission android:name="android.permission.ACCESS_WIFI_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:icon="@drawable/ic_launcher"
@@ -24,4 +28,4 @@
         </activity>
     </application>
 
-</manifest>
+</manifest>

+ 12 - 9
res/layout/activity_main.xml

@@ -17,28 +17,31 @@
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="cs" />
+            android:text="host:" />
 
-        <TextView
-            android:layout_width="wrap_content"
+        <EditText
+            android:id="@+id/edt_host"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="cs" />
+            android:text="@string/v_host" />
 
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="cs" />
+            android:text="@string/port_" />
 
-        <TextView
-            android:layout_width="wrap_content"
+        <EditText
+            android:id="@+id/edt_port"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="cs" />
+            android:text="1080" />
 
         <Button
             android:id="@+id/button1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="设置wifi代理" />
+            android:layout_gravity="center"
+            android:text="@string/_wifi_" />
     </LinearLayout>
 
 </RelativeLayout>

+ 3 - 0
res/values/strings.xml

@@ -4,5 +4,8 @@
     <string name="app_name">WifiProxy</string>
     <string name="hello_world">Hello world!</string>
     <string name="action_settings">Settings</string>
+    <string name="port_">port:</string>
+    <string name="_wifi_">设置wifi代理</string>
+    <string name="v_host">192.168.6.100</string>
 
 </resources>

+ 65 - 18
src/me/yoqi/wifiproxy/MainActivity.java

@@ -1,34 +1,81 @@
 package me.yoqi.wifiproxy;
 
-import android.support.v7.app.ActionBarActivity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import me.yoqi.wifiproxy.utils.ProxySetting;
 
-public class MainActivity extends ActionBarActivity {
+/**
+ * MainActivity
+ * 
+ * @author liuyuqi
+ *
+ */
+public class MainActivity extends AppCompatActivity {
+
+	Context mContext;
+	Button btn1;
+	EditText edt_host, edt_port;
+	SharedPreferences sharedPreferences = mContext.getSharedPreferences("setting", Context.MODE_PRIVATE);;
 
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.activity_main);
+		mContext = this;
+		initView();
 	}
 
-	@Override
-	public boolean onCreateOptionsMenu(Menu menu) {
-		// Inflate the menu; this adds items to the action bar if it is present.
-		getMenuInflater().inflate(R.menu.main, menu);
-		return true;
+	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);
+
+		// 恢复设置
+		String host = sharedPreferences.getString("host", "192.168.6.100");
+		String port = sharedPreferences.getString("port", "1080");
+		edt_host.setText(host);
+		edt_port.setText(port);
+
+		btn1.setOnClickListener(new OnClickListener() {
+
+			@Override
+			public void onClick(View v) {
+				setWifiProxy();
+			}
+		});
 	}
 
-	@Override
-	public boolean onOptionsItemSelected(MenuItem item) {
-		// Handle action bar item clicks here. The action bar will
-		// automatically handle clicks on the Home/Up button, so long
-		// as you specify a parent activity in AndroidManifest.xml.
-		int id = item.getItemId();
-		if (id == R.id.action_settings) {
-			return true;
+	/**
+	 * 设置wifi代理
+	 */
+	private void setWifiProxy() {
+
+		if (ProxySetting
+				.getCurrentWifiConfiguration((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)) != null) {
+			ProxySetting.setWifiProxySettingsFor17And(mContext, edt_host.getText().toString().trim(),
+					Integer.parseInt(edt_port.getText().toString().trim()), null);
+			btn1.setText("取消WIFI代理");
+		} else {
+			ProxySetting.unsetWifiProxySettingsFor17And(mContext);
+			btn1.setText("设置WIFI代理");
 		}
-		return super.onOptionsItemSelected(item);
+		saveConfig();
+	}
+
+	/**
+	 * 保存设置,下次直接点击按钮即可设置代理
+	 */
+	private void saveConfig() {
+		SharedPreferences.Editor editor = sharedPreferences.edit();
+		editor.putString("host", edt_host.getText().toString().trim());
+		editor.putString("port", edt_port.getText().toString().trim());
+		editor.commit();
 	}
 }

+ 168 - 0
src/me/yoqi/wifiproxy/utils/ProxySetting.java

@@ -0,0 +1,168 @@
+package me.yoqi.wifiproxy.utils;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+
+/**
+ * 代理设置
+ * 
+ * @author liuyuqi
+ *
+ */
+public class ProxySetting {
+
+	private static Object proxySettings;
+
+	/**
+	 * 设置公有成员值
+	 * 
+	 * @param obj
+	 * @param value
+	 * @param name
+	 * @throws SecurityException
+	 * @throws NoSuchFieldException
+	 * @throws IllegalArgumentException
+	 * @throws IllegalAccessException
+	 */
+	public static void setEnumField(Object obj, String value, String name)
+			throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+		Field f = obj.getClass().getField(name);
+//		Type safety: Unchecked invocation valueOf(Class<Enum>, String) of the generic method valueOf(Class<T>, String) of type Enum
+		 f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
+	}
+
+	/**
+	 * 获取public字段
+	 * 
+	 * @param obj
+	 * @param name
+	 * @return
+	 * @throws SecurityException
+	 * @throws NoSuchFieldException
+	 * @throws IllegalArgumentException
+	 * @throws IllegalAccessException
+	 */
+	public static Object getFieldObject(Object obj, String name)
+			throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+		Field f = obj.getClass().getField(name);
+		Object out = f.get(obj);
+		return out;
+	}
+
+	/**
+	 * 获取当前WiFi状态
+	 * 
+	 * @param wifiManager
+	 * @return
+	 */
+	public static WifiConfiguration getCurrentWifiConfiguration(WifiManager wifiManager) {
+		if (!wifiManager.isWifiEnabled())
+			return null;// 没有打开wifi
+
+		List<WifiConfiguration> configurationList = wifiManager.getConfiguredNetworks();
+
+		WifiConfiguration configuration = null;
+
+		int cur = wifiManager.getConnectionInfo().getNetworkId();
+
+		for (int i = 0; i < configurationList.size(); ++i) {
+
+			WifiConfiguration wifiConfiguration = configurationList.get(i);
+
+			if (wifiConfiguration.networkId == cur)
+
+				configuration = wifiConfiguration;
+
+		}
+
+		return configuration;
+	}
+
+	/**
+	 * 设置wifi代理 API>17
+	 * 
+	 * @param context
+	 * @param host
+	 *            代理ip
+	 * @param port
+	 *            代理端口
+	 * @param exclList
+	 */
+	public static void setWifiProxySettingsFor17And(Context context, String host, int port, String exclList) {
+		WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+		WifiConfiguration config;
+		config = getCurrentWifiConfiguration(wifiManager);
+		if (config == null)
+			return;
+		try {
+			// get the link properties from the wifi configuration
+			Object linkProperties = getFieldObject(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 Object proxySettings
+			// =proxyPropertiesCtor.newInstance(host, port, exclList);
+			// pass the new object to setHttpProxy
+			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) {
+		}
+	}
+
+	/**
+	 * 取消代理设置
+	 * 
+	 * @param context
+	 */
+	public static void unsetWifiProxySettingsFor17And(Context context) {
+		WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+		WifiConfiguration config;
+		config = getCurrentWifiConfiguration(wifiManager);
+		if (null == config)
+			return;
+		try {
+			// get the link properties from the wifi configuration
+			Object linkProperties = getFieldObject(config, "linkProperties");
+			if (null == linkProperties)
+				return;
+			// get the setHttpProxy method for LinkProperties
+			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);
+			// pass null as the proxy
+			Object[] params = new Object[1];
+			params[0] = null;
+			setHttpProxy.invoke(linkProperties, params);
+			setEnumField(config, "NONE", "proxySettings");
+			// save the config
+			wifiManager.updateNetwork(config);
+			wifiManager.disconnect();
+			wifiManager.reconnect();
+		} catch (Exception e) {
+		}
+	}
+}