2010-06-11 16 views
24

Qual è la chiamata API che devo fare in Android 2.2 (Froyo) per creare un hotspot Wi-Fi (come mostrato nell'elemento Impostazioni Tethering e Hotspot portatile).API hotspot Wi-Fi Android 2.2 API

+0

io ancora non riesco a credere che non v'è alcuna API per attivare/disattivare il tethering. Spero che esista, ma non è ancora stato documentato. – Sney

+0

È documentato: http://www.androidjavadoc.com/2.3/android/net/wifi/WifiManager.html Semplicemente non fa parte dell'API ufficiale. –

risposta

42

È possibile chiamare

private boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled);

utilizzando la riflessione :)

dopo avere ottenuto il WifiManager utilizzare la riflessione per ottenere i WifiManager metodi dichiarati, cercare questo nome di metodo setWifiApEnabled e richiamare attraverso il WifiManager oggetto

Queste API sono contrassegnate come @hide, quindi attualmente non è possibile utilizzarle direttamente, ma appaiono o n l'AIDL per il WifiManager in modo che siano accessibili!

Un esempio può essere:

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

Funziona ma non posso cambiare la configurazione corrente con la mia, e ottenere il WifiConfiguration corrente di un AP attiva drive me a un configuration.Why vuoto?

+0

buona indagine – Schildmeijer

+0

Puoi sempre accedervi tramite la riflessione! –

+0

@ markov00: l'approccio suggerito non fa parte dell'SDK di Android. Non usarlo, punto. – CommonsWare

2

Sembra che non ci sia una chiamata API per creare un hotspot WiFi - mi spiace!

4

funziona su API 8 e versioni successive. Io uso una versione molto diversa da quella in basso (o sopra), e mi sono imbattuto nello stesso problema in cui è stato eseguito markov00; non essere in grado di caricare la configurazione Wifi predefinita per l'AP Wi-Fi portatile. Ho trovato una soluzione altrove.

Se ti piace la soluzione, sarebbe bello se questo è stato accettato come una risposta

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

Quindi dopo aver annullato quello corrente accetta il tuo WifiConfig? – bk138

+0

no, ma usa solo il valore predefinito, già impostato uno – slinden77

+0

@dmmh, è vero aggiungendo "method.invoke (wifi, null, true);" è abilitato. e quindi ho appena cambiato i valori booleani in "falso" per disattivarlo? Che ne dici di verificare lo stato corrente se è acceso/spento? – gumuruh