API точки доступа Wi-Fi для Android 2.2

Какой вызов API мне нужно сделать в Android 2.2 (Froyo) для создания точки доступа Wi-Fi (как показано в пункте настроек Tethering and Portable Hotspot).


person Thomas    schedule 11.06.2010    source источник
comment
До сих пор не могу поверить, что нет API для активации / деактивации модема. Надеюсь, что он существует, но еще не задокументирован.   -  person Sney    schedule 02.07.2010
comment
Это задокументировано: androidjavadoc.com/2.3/android/net/wifi/ WifiManager.html Просто не является частью официального API.   -  person Bart Friederichs    schedule 28.02.2013


Ответы (3)


Вы можете позвонить

private boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled);

используя отражение :)

после получения WifiManager используйте отражение, чтобы получить WifiManager объявленные методы, найдите это имя метода setWifiApEnabled и вызовите его через объект WifiManager

Эти API помечены как @hide, поэтому в настоящее время вы не можете использовать их напрямую, но они отображаются в AIDL для WifiManager, поэтому они доступны!

Примером может быть:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for(Method method: wmMethods){
  if(method.getName().equals("setWifiApEnabled")){
    WifiConfiguration netConfig = new WifiConfiguration();
    netConfig.SSID = "\"PROVAAP\"";
    netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);    netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  

    try {
      method.invoke(wifi, netConfig,true);
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}

Он работает, но я не могу изменить текущую конфигурацию на свою, и получение текущей конфигурации WifiConfiguration активной точки доступа приводит меня к пустой конфигурации. Почему?

person markov00    schedule 02.08.2010
comment
Вы всегда можете получить к ним доступ через отражение! - person Chris Thompson; 02.08.2010
comment
@ markov00: Ваш предлагаемый подход не является частью Android SDK. Не используйте его, и точка. - person CommonsWare; 26.08.2010
comment
@CommonsWare, а почему бы и нет? Я полагаю, что это может не работать в будущей версии Android, но если вы готовы пойти на такой риск, что в этом плохого? - person MatrixFrog; 28.08.2010
comment
@MatrixFrog: Тактически он может сломаться на текущих устройствах. Производители устройств очень охотно убирают или изменяют эту функцию от имени операторов связи. Предположение, что любой код, не относящийся к SDK, будет работать или даже существовать, просто ненадежно. Если вы хотите использовать этот код для какого-нибудь игрушечного приложения, которое используете на своем телефоне, будь моим гостем. Однако только глупец будет выпускать приложение, рассчитанное на разочарование клиентов. В стратегическом плане, чем больше разработчиков обходят SDK, тем труднее мне и другим убедить производителей не лажать с вещами, которые предполагается поддерживать в SDK. - person CommonsWare; 29.08.2010
comment
@CommonsWare: для встроенных приложений совершенно нормально использовать определенную прошивку и конкретное устройство и не публиковать приложение на рынке приложений. - person Lars D; 17.09.2010
comment
Я также мог бы пойти с этим подходом (поскольку я связываю свое приложение с устройством и полностью контролирую, какая версия работает на устройстве). SDK часто ограничивает свой API без уважительной причины - уже есть много примеров, обсуждаемых в группе разработчиков Google Android. К сожалению, отражение - единственный способ справиться с этим, и я бы посоветовал использовать его, если он работает для вашего конкретного случая использования. - person Mathias Conradt; 15.10.2010
comment
@ markov00: это работает в вашем случае? Я пробовал выше на SGS 2.1, но в цикле не было найдено метода setWifiApEnabled, были найдены только setWifiEnabled (не Ap), showApDialog, setEnabledApDialog. Другое дело: как получить / установить ключ? Это в netConfig.wepKeys [0] после вызова метода? - person Mathias Conradt; 15.10.2010
comment
@Mathias SGS 2.1. Я думаю, что модем - это штука 2.2. - person nelsonjchen; 20.01.2011
comment
Samsung уже реализовал это в версии 2.1, в отличие от HTC, но похоже, что источники и методы различаются. - person Mathias Conradt; 20.01.2011
comment
Есть ли способ увидеть реализацию метода, который вы вызываете через отражение. Например, здесь android.googlesource.com/platform/frameworks/base / + / метод даже не листет. - person Pascal Klein; 07.04.2013
comment
подождите, ... подождите ... вы, ребята, решаете дело прямо сейчас? Я имею в виду, включалась ли беспроводная точка доступа с помощью этого кода? Я не видел, где мы могли бы включить / выключить его из кода. @MathiasLin - person gumuruh; 18.07.2014
comment
@PascalKlein не знает, на что вы ссылаетесь, но вы можете найти метод в текущей версии froyo: android.googlesource.com/platform/frameworks/base / + / - person markov00; 18.07.2014
comment
@gumuruh он работал, когда я его тестировал. Это обходной путь, который может работать на очень ограниченном наборе устройств и не предназначен для использования в производственной среде. В моем предыдущем комментарии вы можете увидеть скрытый метод в WifiManager. Используя отражение Java, как я указал в ответе, и в зависимости от вашего целевого устройства вы можете программно включить точку доступа Wi-Fi. - person markov00; 18.07.2014
comment
Кажется, я не видел, где я мог бы включить / выключить из кода. Но я нашел whitebyte.info/android/. Похоже. также omtlab.com/android-enable-disable-hotspot-programmatically @ markov00 - person gumuruh; 18.07.2014
comment
@gumuruh последний аргумент метода invoke дает вам возможность включать и выключать AP --- ›method.invoke (wifi, null, true); - person markov00; 18.07.2014
comment
видите ... другой пользователь тоже этого не понимает ... точно так же, как @PascalKlein. Я тоже просто знал это тогда. Еще раз спасибо markov00 - person gumuruh; 19.07.2014

это работает с API 8 и выше. Я использую сильно другую версию, чем эта ниже (или выше), и столкнулся с той же проблемой, с которой столкнулся markov00; невозможность загрузить WifiConfiguration по умолчанию для портативной точки доступа Wi-Fi. Я нашел решение в другом месте.

Если вам нравится решение, было бы неплохо, если бы это было принято в качестве ответа

WifiManager wifi    = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods  = wifi.getClass().getDeclaredMethods();

for (Method method: wmMethods){
    if (method.getName().equals("setWifiApEnabled")){
        try {
            // just nullify WifiConfiguration to load the default configuration ;)
            method.invoke(wifi, null, true);
        } catch (IllegalArgumentException e){
            e.printStackTrace();
        } catch (IllegalAccessException e){
            e.printStackTrace();
        } catch (InvocationTargetException e){
            e.printStackTrace();
        }
    }
}
person slinden77    schedule 31.07.2012
comment
Значит, после обнуления текущего он принимает ваш WifiConfig? - person bk138; 28.11.2012
comment
@dmmh, правда ли, добавив method.invoke (wifi, null, true); он включен. и поэтому я просто меняю логические значения на false, чтобы выключить его? Как насчет того, чтобы проверить его текущее состояние, включено ли оно / выключено? - person gumuruh; 23.06.2014

Похоже, что не существует вызова API для создания точки доступа Wi-Fi - извините!

person CommonsWare    schedule 11.06.2010