android WIFI 设置代理代码 4.4.3——5.0

记录下android中设置代理代码 或许有朋友能用的上

适用于4.4.3 在5.0上android.net.ProxyProperties 找不到 估计API被谷歌拿掉了 4.4.4还没试估计API还在

private static String NOTPROXY = ""; //不走代理名单

     private  static   List<String> list;
    //type为1设置wifi设置   为0是清除代理
    public static void setWifi(Context context, final String ip, final int port, final int type) throws SecurityException, IllegalArgumentException,
            NoSuchFieldException, IllegalAccessException,
            NoSuchMethodException, ClassNotFoundException,
            InstantiationException, InvocationTargetException {
        final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        final String ssid = wifiManager.getConnectionInfo().getSSID();
        List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
       changeNotProxy();
        for (WifiConfiguration config : configuredNetworks) {
            Log.d("txy", "current SSID is" + config.SSID);
            if (config.SSID.toString().contains(Common.MYSSID)) {  //需要给哪个无线设置代理
                Class proxyPropertiesClass = Class
                        .forName("android.net.ProxyProperties");
                Constructor c = proxyPropertiesClass.getConstructor(String.class,
                        Integer.TYPE, String.class);
                c.setAccessible(true);
                //wifiIP 为代理的IP地址  如:192.168.0.111   wifiPort为代理端口 如888

                setProxy(config, (type == 0 ? null : c.newInstance(ip, port, NOTPROXY)), type);
                wifiManager.updateNetwork(config);
                break;
            } else {
//                wifiManager.removeNetwork(config.networkId);
            }
        }
        wifiManager.disconnect();
        wifiManager.reconnect();
    }
    public static void setObjField(Object obj, Object value, String name)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getDeclaredField(name);
        f.setAccessible(true);
        f.set(obj, value);
    }

    //type为1设置wifi设置   为0是清除代理
    public static WifiConfiguration setProxy(WifiConfiguration wifiConf, Object properties, int type)
            throws SecurityException, IllegalArgumentException,
            NoSuchFieldException, IllegalAccessException,
            NoSuchMethodException, ClassNotFoundException,
            InstantiationException, InvocationTargetException {
        if (type == 0) setEnumField(wifiConf, "NONE", "proxySettings");
        else setEnumField(wifiConf, "STATIC", "proxySettings");
        Object linkProperties = getField(wifiConf, "linkProperties");
        setObjField(linkProperties, properties, "mHttpProxy");
        setObjField(wifiConf, linkProperties, "linkProperties");
        return wifiConf;
    }

    public static void setEnumField(Object obj, String value, String name)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getField(name);
        f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
    }

    public static Object getField(Object obj, String name)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getField(name);
        Object out = f.get(obj);
        return out;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

5.0

  private  static   List<String> list;//不走代理名单 

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public static void set_proxy(Application context, String ip, String port, int type) throws Throwable
    {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wi = wifiManager.getConnectionInfo();

        List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
        changeNotProxy();
        for(WifiConfiguration config : configuredNetworks)
        {
            //需要给哪个无线设置代理
            if(config.SSID.equals(wi.getSSID()))
            {

                Class proxySettings = Class.forName("android.net.IpConfiguration$ProxySettings");

                Class[] setProxyParams = new Class[2];
                setProxyParams[0] = proxySettings;
                setProxyParams[1] = ProxyInfo.class;

                Method setProxy = config.getClass().getDeclaredMethod("setProxy", setProxyParams);
                setProxy.setAccessible(true);

                if(type == 0)
                {
                    Object[] methodParams = new Object[2];
                    methodParams[0] = Enum.valueOf(proxySettings, "NONE");
                    methodParams[1] = null;

                    setProxy.invoke(config, methodParams);
                }
                else
                {
                    ProxyInfo desiredProxy = ProxyInfo.buildDirectProxy(ip, Integer.parseInt(port),list);

                    Object[] methodParams = new Object[2];
                    methodParams[0] = Enum.valueOf(proxySettings, "STATIC");
                    methodParams[1] = desiredProxy;

                    setProxy.invoke(config, methodParams);
                }

                //save the settings
                wifiManager.updateNetwork(config);
                wifiManager.disconnect();
                wifiManager.reconnect();

                break;
            }
        }
    }
时间: 2024-12-12 06:07:20

android WIFI 设置代理代码 4.4.3——5.0的相关文章

Android Studio设置代理

我们都知道Android Studio是基于IDEA开发的,而我们写的每一个程序又都是有Gradle构建的,Gradle的优点可以说是很多,被很多程序员夸得没边,但是它有一个特点还是值得我们注意的.我们每一次点击这个按钮来执行我们的程序时,都会先调用这个来进行构建,这个和Eclipse上还是不一样的,因为Gradle构建的时候要联网,但是联网就联网呗,偏偏还要连接到墙外面的网络,我当初刚刚涉足移动开发的时候可被它给坑苦了,现在想一想真是蛋疼啊,信心满满的装好了高大上的Android Studio

Android Studio设置代理更新下载SDK

代理主机和端口号按下图设置即可,便可以轻松的下载更新SDK啦~~~

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

如何在android studio 1.0 启动时设置代理【解决WARN - ateSettings.impl.UpdateChecker - Connection failed.】

今天第一次用android studio,下了个比较新的1.0.1 linux版本,结果启动时老是出现以下错误: [ 6987] WARN - ateSettings.impl.UpdateChecker - Connection failed. Please check your network connection and try again. 百度了以下,都没找到可行方案,最后在google里找到了解决方案,在此记录下来,供大家参考. 方法1: 到android studio安装目录,打开

android tips—开机引导启动wifi设置

在开机引导(Setupwizard,Guide)中都有关于wifi设置项,我得做法如下: Intent intent = new Intent(); intent.setClassName("com.android.settings", "com.android.settings.wifi.WifiSetupActivity"); intent.putExtra("firstRun",false); startActivity(intent);

Android如何在java代码中设置margin

习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom).可是View本身没

判断Android的WIFI与GPS状态,并引导用户前去开启GPS与WIFI设置

需要配置权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 判断Android的WIFI与GPS状态 private void checkWifiAndGpsStatus() { boolean res

为Android Studio设置HTTP代理

大陆的墙很厚很高,初次安装Android Studio下载SDK等必定失败,设置代理方法如下: 1. 到android studio安装目录,打开bin目录,编辑idea.properties, 在文件末尾添加: disable.android.first.run=true 这将禁用第一次运行 2. 再次打开android studio将进入欢迎页面,点击Config-, 搜索HTTP,即可设置HTTP代理 3. 删掉Step 1 中所加的那一行,再次启动android studio,就可以使用

Android 壁纸设置代码 详解

做一个游戏图片列表,想着增加设置壁纸功能,就差了一些资料. 1 别忘记在ApplicationManifest.xml 中加上权限的设置. <uses-permission android:name = "android.permission.SET_WALLPAPER"/> 2.设置壁纸的方法总结. 壁纸设置方法有三种 第一 通过WallpaperManager方法中的 setBitmap() 第二 通过WallpaperManager方法中的 setResource()