2011-12-20 20 views
13

Korzystam z nowego interfejsu API Wi-Fi Direct z google na Androida 4.0 , a w przykładowym kodzie wysyłają użytkownika do ustawień, aby aktywować tryb sieciowy WiFi.Czy mogę włączyć WiFi-Direct z kodu? na Androidzie API-14 (ICS)

Czy istnieje sposób, aby uruchomić go za pomocą kodu ???

wszystkie one oferują jest słuchać WIFI_P2P_STATE_CHANGED_ACTION intencji, a następnie użyć tego kodu

String action = intent.getAction(); 

if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 

    // UI update to indicate wifi p2p status. 
    int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); 

    if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { 
     // Wifi Direct mode is enabled 

    } else { 
     // Wifi Direct mode is disabled 
    } 
+1

Nie wiem, czy to działa na 4,0, ale działa na ostatnich: http: // www .tutorialforandroid.com/2009/10/wyłącz-włącz-włącz-wifi-w-android-using.html – Carlos

Odpowiedz

13

Tak, jest sposób używania odbicia. Działa na moim GSII (i z wdziękiem nie działa na HTC Direct Sensation), ale ponieważ jest to odbicie, może nie działać na wszystkich telefonach.

p2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE); 
channel = p2pManager.initialize(getApplicationContext(), 
     getMainLooper(), null); 

try { 
    Class<?> wifiManager = Class 
      .forName("android.net.wifi.p2p.WifiP2pManager"); 

    Method method = wifiManager 
      .getMethod(
       "enableP2p", 
       new Class[] { android.net.wifi.p2p.WifiP2pManager.Channel.class }); 

    method.invoke(p2pManager, channel); 

} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Uwaga:

Na Jelly Bean i wyżej, gdy spróbujesz użyć WifiP2pManager API, WiFi-Direct jest automatycznie włączony (tak długo, jak WiFi jest włączony), więc nie jest musisz użyć tego hacka.

+0

Chciałbym dodać, że Wi-Fi bezpośrednio na JB i powyżej (przynajmniej na AOSP) nie jest cały czas aktywne - wydaje się, że jest tylko . Jeśli spojrzysz na słuchaczy na bezpośrednie Wi-Fi, po pewnym czasie wyłącza się. Włącza się ponownie, jeśli otworzysz bezpośrednie menu Wi-Fi. Może być konieczne, aby host wykonał wyszukiwanie w sieci równorzędnej lub zainicjował się, aby móc go znaleźć. Prawdopodobnie sztuczka oszczędzająca baterię. Odkryłem też, że blokuje, ponieważ ponieważ akceptuje połączenie, cały system blokuje się i czasami nie łączy. (Zaproszenie do systemu) – Mgamerz

+0

I jeszcze jedno: ten kod działa tylko wtedy, gdy zaczyna działać Wi-Fi. Mój telefon (LG Mach 4.0.4) wyrzuca metodę, która nie została znaleziona, jeśli jest wyłączona, ale działa ona pięknie, jeśli jest już włączona. – Mgamerz

+0

@Mgamerz Wierd, na GSII działa, gdy Wifi jest włączone lub wyłączone (jeśli jest wyłączone, automatycznie włącza je, ale trwa kilka sekund, aby faktycznie zadziałać, chociaż metoda natychmiast powraca) –

2

Nie, wszystko można zrobić, to powiadomić użytkownika, aby włączyć WiFi.

+0

Czy istnieje sposób sprawdzenia, czy jest włączony, nie czekając na zamiar? -dla przykładu, jeśli użytkownik był włączony przed uruchomieniem aplikacji .... – zaxy78

0

Na niektórych urządzeniach, nawet jeśli funkcja Wi-Fi direct jest obsługiwana, nie jest włączona z powodu niektórych błędów systemowych. Oto bardziej niezawodny sposób sprawdzenia, czy jest włączony (niestety wymaga rootowania) przy użyciu Kotlina.

val matcher = "^mNetworkInfo .* (isA|a)vailable: (true|false)" 
    .toPattern(Pattern.MULTILINE) 
    .matcher(su("dumpsys ${Context.WIFI_P2P_SERVICE}")) 
if (!matcher.find()) return "Root unavailable" 
if (matcher.group(2) != "true") return "Wi-Fi Direct unavailable" 
return "Wi-Fi Direct available" 

To powinno działać dla systemu Android 4.3 - 8.1. Sprawdź kod źródłowy poniżej:

Powiązane problemy