2011-12-20 8 views
13

Estoy usando la nueva API Wi-Fi Direct de google en Android 4.0 y en el código de muestra que envían al usuario a la configuración, para activar WiFi-Modo directo.¿Puedo activar WiFi-Direct desde el código? en Android API-14 (ICS)

¿Hay alguna manera de iniciarlo por código ???

todo lo que ofrecen es escuchar WIFI_P2P_STATE_CHANGED_ACTION intención, y luego usar este código

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

No sabe si funciona en 4.0, pero funciona en anterior: http: // www .tutorialforandroid.com/2009/10/turn-off-turn-on-wifi-in-android-usage.html – Carlos

Respuesta

13

Sí, hay una forma de usar la reflexión. Funciona en mi GSII (y falla con gracia en HTC Sensation directa sin WiFi) pero como esto es reflejo, puede que no funcione en todos los teléfonos.

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

Tenga en cuenta:

En Jelly Bean y por encima, cuando se intenta utilizar el WifiP2pManager API, WiFi-Direct se activa automáticamente (siempre y cuando Wi-Fi está activada), lo que no hay Necesito usar este truco.

+0

Me gustaría añadir que WiFi directo en JB y superior (al menos en AOSP) no está activo todo el tiempo, solo parece ser . Si miras a los oyentes para WiFi Direct, se apaga después de un tiempo. Sin embargo, se vuelve a encender si abre el menú directo wifi. Es posible que tenga que hacer que el host realice una búsqueda entre iguales o que se inicialice para poder ser encontrado. Probablemente un truco de ahorro de batería. También he descubierto que está bloqueando, ya que como acepta una conexión, todo el sistema se bloqueará y no se podrá conectar a veces. (La invitación del sistema) – Mgamerz

+0

Y agrega una cosa más: este código solo funciona si parece que está listo para usar Wifi. Mi teléfono (LG Mach 4.0.4) arroja un método que no se encuentra si está apagado, pero funciona muy bien si ya está encendido. – Mgamerz

+0

@Mgamerz Wierd, en GSII funciona cuando Wifi está encendido o apagado (si está apagado lo enciende automáticamente pero tarda unos segundos en funcionar, aunque el método vuelve de inmediato) –

2

No, lo único que podría hacer es notificar al usuario para activar el Wi-Fi.

+0

¿Hay alguna manera de comprobar si está activado sin esperar la intención? -por ejemplo, si el usuario se conectó antes de ejecutar mi aplicación .... – zaxy78

0

En algunos dispositivos, aunque Wi-Fi Direct es compatible, no está habilitado debido a algunos errores del sistema. Esta es una forma más confiable de verificar si está habilitado (lamentablemente se requiere root) usando Kotlin.

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" 

Esto debería funcionar para Android 4.3 - 8.1. Código de control de fuente a continuación:

Cuestiones relacionadas