2010-06-11 10 views
24

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

+0

Я до сих пор не могу поверить, что нет API для активации/деактивации привязывать. Надеюсь, что он существует, но пока еще не задокументирован. – Sney

+0

Документировано: http://www.androidjavadoc.com/2.3/android/net/wifi/WifiManager.html Просто не являетесь частью официального API. –

ответ

42

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

private boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled);

с помощью отражения :)

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

Эти API отмечены как @hide, поэтому в настоящее время вы не можете использовать их напрямую, но они выглядят o n 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 активного AP подвезти меня к пустому configuration.Why?

+0

хорошее исследование – Schildmeijer

+0

Вы всегда можете получить к ним доступ через отражение! –

+0

@ markov00: Ваш предложенный подход не является частью Android SDK. Не используйте его, период. – CommonsWare

2

Существует не API-вызов для создания точки доступа WiFi - извините!

4

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

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

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(); 
     } 
    } 
} 
+0

Итак, после аннулирования текущего, он принимает ваш WifiConfig? – bk138

+0

нет, но он просто использует значение по умолчанию, уже установленное значение – slinden77

+0

@dmmh, верно ли это путем добавления метода method.invoke (wifi, null, true); он включен. и поэтому я просто изменяю логические значения на «false», чтобы отключить его? Что делать, чтобы проверить текущее состояние, включено ли оно? – gumuruh

Смежные вопросы