изменил расширенный вариант Wi-Fi из кода, но он не будет работать?

1

Я использовал этот код для изменения настройки Ip Ip (Ip-адрес и шлюз)

вы можете увидеть полный код здесь: полный класс

WifiConfiguration wifiConf = null;
    WifiManager manager = (WifiManager) getSystemService(MainActivity.WIFI_SERVICE);
        WifiInfo connectionInfo = manager.getConnectionInfo();
    List<WifiConfiguration> configuredNetworks = manager
            .getConfiguredNetworks();

    wifiConf = GetCurrentWifiConfiguration(manager);

setIpAssignment("STATIC", wifiConf); 
setIpAddress(InetAddress.getByName("192.2.2.2"), 24, wifiConf);
setGateway(InetAddress.getByName("192.2.2.22"), wifiConf);
manager.updateNetwork(wifiConf); 
manager.saveConfiguration(); 

функции:

 public static void setIpAssignment(String assign , WifiConfiguration wifiConf)
        throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException{
    setEnumField(wifiConf, assign, "ipAssignment");
}


public static void setIpAddress(InetAddress addr, int prefixLength, WifiConfiguration wifiConf)
        throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException,
        NoSuchMethodException, ClassNotFoundException, InstantiationException, InvocationTargetException{
    Object linkProperties = getField(wifiConf, "linkProperties");
    if(linkProperties == null)return;
    Class laClass = Class.forName("android.net.LinkAddress");
    Constructor laConstructor = laClass.getConstructor(new Class[]{InetAddress.class, int.class});
    Object linkAddress = laConstructor.newInstance(addr, prefixLength);

    ArrayList mLinkAddresses = (ArrayList)getDeclaredField(linkProperties, "mLinkAddresses");
    mLinkAddresses.clear();
    mLinkAddresses.add(linkAddress);
}


public static void setGateway(InetAddress gateway, WifiConfiguration wifiConf)
        throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException,
        ClassNotFoundException, NoSuchMethodException, InstantiationException, InvocationTargetException {
    Object linkProperties = getField(wifiConf, "linkProperties");
    if(linkProperties == null)return;
    Class routeInfoClass = Class.forName("android.net.RouteInfo");
    Constructor routeInfoConstructor = routeInfoClass.getConstructor(new Class[]{InetAddress.class});
    Object routeInfo = routeInfoConstructor.newInstance(gateway);

    ArrayList mRoutes = (ArrayList)getDeclaredField(linkProperties, "mRoutes");
    mRoutes.clear();
    mRoutes.add(routeInfo);
}

проблема здесь:

эти коды успешно изменяют IP-адрес и шлюз, когда вы проверяете опцию Wi-Fi для подключения к вашему устройству Android, но настройка на самом деле не установлена ​​!!!

как я понимаю это:

сначала я установил фальшивый IP-адрес и шлюз вручную, изменив опцию network- > advanced. а затем попытайтесь открыть веб-сайт с хромом, без доступа в Интернет, и он сработал. затем я установил один и тот же адрес Ip ​​и шлюз для подключения ssid из кода, но он не работал и все еще имеет доступ в Интернет.

Я использовал те же настройки из кода и вручную, но не работал с кодом. где я ошибся?

  • 0
    это поведение ограничено конкретной версией ОС?
  • 0
    Проверьте этот пост: stackoverflow.com/questions/8863509/… и, возможно, установите разрешения Wi-Fi, описанные там: ACCESS_WIFI_STATE и CHANGE_WIFI_STATE. Я полагаю, они идут рука об руку с wifimanager ..
Показать ещё 1 комментарий
Теги:
wifi
ip

3 ответа

0
mWifiManager.updateNetwork(selectWIfiConfi);
mWifiManager.saveConfiguration();
mWifiManager.setWifiEnabled(false);

mWifiManager.setWifiEnabled(true);

Я снова открываю Wi-Fi и работает версия телефона 4.2.2

0

Добавление любого количества дубликатов SSID возможно, если у вас есть уникальный IP-адрес.

В условиях неспециалиста SSID - это всего лишь идентификация данной конкретной сети, предназначенная для того, чтобы отличить эту сеть от других для простоты. Что определяет, что это IP-адрес. Если у вас есть конфликт между IP-адресом, это может быть реальной проблемой.

Для некоторых устройств (например, Samsung) вам необходимо проверить на "Показать открытое сетевое подключение", если оно доступно для просмотра открытых подключений и для некоторых устройств, которые он показывает по умолчанию.

Пример: -Позвольте сказать, что у вас две сети с SSID в качестве теста. Test1 имеет открытое соединение, доступное для общего пользования, а Test2 предназначен для личного использования и шифруется. Ваше мобильное устройство просто подключится к сети, уровень сигнала которой хорош. Поскольку IP-адрес отличается, конфликта не будет, и вы можете выполнять просмотр.

В случае возникновения конфликта (тот же уровень сигнала) устройство попросит пользователя выбрать нужную сеть или выполнить поиск новой сети.

Предостережение: -Бонирование открытой сети по причинам, связанным с финансированием, приводит к серьезным угрозам безопасности на ваш страх и риск.

IP-адрес выполняет две основные функции: идентификацию хоста или сетевого интерфейса и адресацию адресов. Его роль была охарактеризована следующим образом: "Имя указывает, что мы ищем. Адрес указывает, где он находится. Маршрут указывает, как туда добраться.

Самое простое определение IP-адреса, которое я мог бы дать, -

IP-адрес действует как домашний адрес, на который должна быть отправлена ​​отправка. Если у вас есть два одинаковых адреса, то кому будет доставлен груз. Для получения дополнительной информации о IP читайте this

Теперь в основном мой ответ на ваш вопрос:

Вы можете демонстративно добавить несколько параметров с помощью ssid, но другой уровень безопасности

МАЛЕНЬКАЯ ДЕМО, ПОДГОТОВЛЕННАЯ:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        connectToAP("12345", "12345");

        WifiConfiguration wifiConf = null;
        WifiManager wifiManager = (WifiManager) getSystemService(MainActivity.WIFI_SERVICE);
        WifiInfo connectionInfo = wifiManager.getConnectionInfo();
        List<WifiConfiguration> configuredNetworks = wifiManager
                .getConfiguredNetworks();
        for (WifiConfiguration conf : configuredNetworks) {
            if (conf.networkId == 9) {

                wifiConf = conf;
                setWifiProxySettings(wifiConf);

                try {
                    setIpAssignment("STATIC", wifiConf); // or "DHCP" for
                                                         // dynamic setting
                    setIpAddress(InetAddress.getByName("192.168.0.100"), 24,
                            wifiConf);
                    setGateway(InetAddress.getByName("4.4.4.4"), wifiConf);
                    setDNS(InetAddress.getByName("4.4.4.4"), wifiConf);
                    wifiManager.updateNetwork(wifiConf); // apply the setting
                    wifiManager.saveConfiguration(); // Save it
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            }
        }

    }

    public static void setIpAssignment(String assign, WifiConfiguration wifiConf)
            throws SecurityException, IllegalArgumentException,
            NoSuchFieldException, IllegalAccessException {
        setEnumField(wifiConf, assign, "ipAssignment");
    }

    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 void setIpAddress(InetAddress addr, int prefixLength,
            WifiConfiguration wifiConf) throws SecurityException,
            IllegalArgumentException, NoSuchFieldException,
            IllegalAccessException, NoSuchMethodException,
            ClassNotFoundException, InstantiationException,
            InvocationTargetException {
        Object linkProperties = getField(wifiConf, "linkProperties");
        if (linkProperties == null)
            return;
        Class laClass = Class.forName("android.net.LinkAddress");
        Constructor laConstructor = laClass.getConstructor(new Class[] {
                InetAddress.class, int.class });
        Object linkAddress = laConstructor.newInstance(addr, prefixLength);

        ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,
                "mLinkAddresses");
        mLinkAddresses.clear();
        mLinkAddresses.add(linkAddress);
    }

    public static void setGateway(InetAddress gateway,
            WifiConfiguration wifiConf) throws SecurityException,
            IllegalArgumentException, NoSuchFieldException,
            IllegalAccessException, ClassNotFoundException,
            NoSuchMethodException, InstantiationException,
            InvocationTargetException {
        Object linkProperties = getField(wifiConf, "linkProperties");
        if (linkProperties == null)
            return;
        Class routeInfoClass = Class.forName("android.net.RouteInfo");
        Constructor routeInfoConstructor = routeInfoClass
                .getConstructor(new Class[] { InetAddress.class });
        Object routeInfo = routeInfoConstructor.newInstance(gateway);

        ArrayList mRoutes = (ArrayList) getDeclaredField(linkProperties,
                "mRoutes");
        mRoutes.clear();
        mRoutes.add(routeInfo);
    }

    public static void setDNS(InetAddress dns, WifiConfiguration wifiConf)
            throws SecurityException, IllegalArgumentException,
            NoSuchFieldException, IllegalAccessException {
        Object linkProperties = getField(wifiConf, "linkProperties");
        if (linkProperties == null)
            return;

        ArrayList<InetAddress> mDnses = (ArrayList<InetAddress>) getDeclaredField(
                linkProperties, "mDnses");
        mDnses.clear(); // or add a new dns address , here I just want to
                        // replace DNS1
        mDnses.add(dns);
    }

    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;
    }

    public static Object getDeclaredField(Object obj, String name)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getDeclaredField(name);
        f.setAccessible(true);
        Object out = f.get(obj);
        return out;
    }

    @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;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    String TAG = "wifi";
    WifiManager wifiManager;

    public void connectToAP(String ssid, String passkey) {
        Log.i(TAG, "* connectToAP");
        wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiConfiguration wifiConfiguration = new WifiConfiguration();

        String networkSSID = ssid;
        String networkPass = passkey;

        Log.d(TAG, "# password " + networkPass);

        // for (ScanResult result : scanResultList) {
        // if (result.SSID.equals(networkSSID)) {
        if (true) {
            // String securityMode = getScanResultSecurity(result);
            String securityMode = "OPEN";
            if (securityMode.equalsIgnoreCase("OPEN")) {

                wifiConfiguration.SSID = "\"" + networkSSID + "\"";
                wifiConfiguration.allowedKeyManagement
                        .set(WifiConfiguration.KeyMgmt.NONE);
                int res = wifiManager.addNetwork(wifiConfiguration);
                Log.d(TAG, "# add Network returned " + res);

                boolean b = wifiManager.enableNetwork(res, true);
                Log.d(TAG, "# enableNetwork returned " + b);

                wifiManager.setWifiEnabled(true);

            } else if (securityMode.equalsIgnoreCase("WEP")) {

                wifiConfiguration.SSID = "\"" + networkSSID + "\"";
                wifiConfiguration.wepKeys[0] = "\"" + networkPass + "\"";
                wifiConfiguration.wepTxKeyIndex = 0;
                wifiConfiguration.allowedKeyManagement
                        .set(WifiConfiguration.KeyMgmt.NONE);
                wifiConfiguration.allowedGroupCiphers
                        .set(WifiConfiguration.GroupCipher.WEP40);
                int res = wifiManager.addNetwork(wifiConfiguration);
                Log.d(TAG, "### 1 ### add Network returned " + res);

                boolean b = wifiManager.enableNetwork(res, true);
                Log.d(TAG, "# enableNetwork returned " + b);

                wifiManager.setWifiEnabled(true);
            }

            wifiConfiguration.SSID = "\"" + networkSSID + "\"";
            wifiConfiguration.preSharedKey = "\"" + networkPass + "\"";
            wifiConfiguration.hiddenSSID = true;
            wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
            wifiConfiguration.allowedGroupCiphers
                    .set(WifiConfiguration.GroupCipher.TKIP);
            wifiConfiguration.allowedGroupCiphers
                    .set(WifiConfiguration.GroupCipher.CCMP);
            wifiConfiguration.allowedKeyManagement
                    .set(WifiConfiguration.KeyMgmt.WPA_PSK);
            wifiConfiguration.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.TKIP);
            wifiConfiguration.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.CCMP);
            wifiConfiguration.allowedProtocols
                    .set(WifiConfiguration.Protocol.RSN);
            wifiConfiguration.allowedProtocols
                    .set(WifiConfiguration.Protocol.WPA);

            int res = wifiManager.addNetwork(wifiConfiguration);
            Log.d(TAG, "### 2 ### add Network returned " + res);

            wifiManager.enableNetwork(res, true);

            boolean changeHappen = wifiManager.saveConfiguration();

            if (res != -1 && changeHappen) {
                Log.d(TAG, "### Change happen");

                // AppStaticVar.connectedSsidName = networkSSID;

            } else {
                Log.d(TAG, "*** Change NOT happen");
            }

            wifiManager.setWifiEnabled(true);
        }
        // }
    }

    public String getScanResultSecurity(ScanResult scanResult) {
        Log.i(TAG, "* getScanResultSecurity");

        final String cap = scanResult.capabilities;
        final String[] securityModes = { "WEP", "PSK", "EAP" };

        for (int i = securityModes.length - 1; i >= 0; i--) {
            if (cap.contains(securityModes[i])) {
                return securityModes[i];
            }
        }

        return "OPEN";
    }

    /* PROXY SETTINGS */
    /*********************************************************************/
    // 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;
    // }
    //
    // public static Object getDeclaredField(Object obj, String name)
    // throws SecurityException, NoSuchFieldException,
    // IllegalArgumentException, IllegalAccessException {
    // Field f = obj.getClass().getDeclaredField(name);
    // f.setAccessible(true);
    // Object out = f.get(obj);
    // return out;
    // }
    //
    // 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 void setProxySettings(String assign,
            WifiConfiguration wifiConf) throws SecurityException,
            IllegalArgumentException, NoSuchFieldException,
            IllegalAccessException {
        setEnumField(wifiConf, assign, "proxySettings");
    }

    WifiConfiguration GetCurrentWifiConfiguration(WifiManager manager) {
        if (!manager.isWifiEnabled())
            return null;

        List<WifiConfiguration> configurationList = manager
                .getConfiguredNetworks();
        WifiConfiguration configuration = null;
        int cur = manager.getConnectionInfo().getNetworkId();
        for (int i = 0; i < configurationList.size(); ++i) {
            WifiConfiguration wifiConfiguration = configurationList.get(i);
            if (wifiConfiguration.networkId == cur)
                configuration = wifiConfiguration;
        }

        return configuration;
    }

    void setWifiProxySettings(WifiConfiguration config) {

        if (null == config)
            return;

        try {

            Object linkProperties = getField(config, "linkProperties");
            if (null == linkProperties)
                return;

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

            // get ProxyProperties constructor
            Class[] proxyPropertiesCtorParamTypes = new Class[3];
            proxyPropertiesCtorParamTypes[0] = String.class;
            proxyPropertiesCtorParamTypes[1] = int.class;
            proxyPropertiesCtorParamTypes[2] = String.class;

            Constructor proxyPropertiesCtor = proxyPropertiesClass
                    .getConstructor(proxyPropertiesCtorParamTypes);

            // create the parameters for the constructor
            Object[] proxyPropertiesCtorParams = new Object[3];
            proxyPropertiesCtorParams[0] = "127.0.0.1";
            proxyPropertiesCtorParams[1] = 8118;
            proxyPropertiesCtorParams[2] = "example.com";

            // create a new object using the params
            Object proxySettings = proxyPropertiesCtor
                    .newInstance(proxyPropertiesCtorParams);

            // pass the new object to setHttpProxy
            Object[] params = new Object[1];
            params[0] = proxySettings;
            setHttpProxy.invoke(linkProperties, params);

            setProxySettings("STATIC", config);

        } catch (Exception e) {
        }
    }

    void unsetWifiProxySettings() {
        WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration config = GetCurrentWifiConfiguration(manager);
        if (null == config)
            return;

        try {
            // get the link properties from the wifi configuration
            Object linkProperties = getField(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);

            setProxySettings("NONE", config);

            // save the config
            manager.updateNetwork(config);
            manager.disconnect();
            manager.reconnect();
        } catch (Exception e) {
        }
    }

}

ЗДЕСЬ В ВЫШЕМ КОДЕ ПОПРОБУЙТЕ ИСПОЛЬЗОВАТЬ СВОЙ КОД С:

  String securityMode = "OPEN";

  String securityMode = "WEP";

один раз за раз:

НАБЛЮДЕНИЕ: ОБА УСТАНОВКИ ПОЛУЧЕНЫ ПРОГРАММАМИ, НО МОЖЕТ БЫТЬ УВИДЕТЬ ТОЛЬКО ОДИН РАЗ, КАК ОБА ОБОГАЩАЕТСЯ С КАКОЙ-ЛИБО ДРУГОЙ.. И БЫТЬ НАСТОЯЩИМ. теперь вопрос в том, как я знаю, что оба присутствуют? 1. Запустите код выше. 2. один раз с OPEN в качестве уровня безопасности и один раз с WEP 3. после добавления вкладки wifi и есть возможность забыть сеть. 4. Вы будете наблюдать, что, хотя вы удалили его, он все еще там:) 5. Следовательно, оба параметра существуют, но программно программно перекрываются.

МОЙ АНАЛИЗ С HOTSPOT:

Я включил 2 устройства в качестве точки доступа с одним и тем же ssid, но с другим уровнем безопасности, и я вижу два отдельных Wi-Fi, но дело в том, что при добавлении программно он остается там, но перекрывается.

ПРИМЕЧАНИЕ. ДОБАВЛЕНИЕ ВНЕШНЕГО ИЛИ ПРОГРАММНО-ТАМИЧЕСКОГО ИСПОЛЬЗОВАНИЯ УСТАНОВКИ WIFI ПОЛНОСТЬЮ НАРУШИТСЯ СУЩЕСТВУЮЩИМ ОДНОМУ, НО ДАЖЕ С ДЕЙСТВИТЕЛЬНЫМ РАЗНООБРАЗИЕМ РАБОТЫ.

0

Как я вижу, вы смогли изменить настройки и получить значения, измененные в представлении настроек, но фактического изменения состояния системы на устройстве не произошло.

У вас наиболее вероятно нет привилегий для изменения настроек Wi-Fi в вашей программе.

Попробуйте добавить следующее:

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE
ACCESS_NETWORK_STATE

См. мои комментарии к вопросу для получения дополнительной информации.

  • 0
    Я использовал эти разрешения, это не проблема

Ещё вопросы

Сообщество Overcoder
Наверх
Меню