2012-05-11 32 views
9

Tengo 2 dispositivos Android que usan WiFi Direct. En un dispositivo puedo obtener información sobre el otro dispositivo usando la clase WifiP2pManager, y solicitar una conexión al otro dispositivo. Sin embargo, cuando solicito una conexión, el otro dispositivo abre una pequeña ventana y le pregunta al usuario si desea aceptar la solicitud de conexión.Cómo aceptar automáticamente las solicitudes de conexión Wi-Fi Direct en Android

¿Es posible aceptar automáticamente estas solicitudes de conexión? I.E para poder conectar al otro dispositivo sin la confirmación del usuario?

+2

puedo apreciar cómo esto suena un poco sospechoso. Como si estuviera tratando de conectarme al dispositivo sin que el usuario lo sepa. Pero estamos viendo la posibilidad de usar dispositivos Android como base para el seguimiento y registro de vehículos. Entonces estos dispositivos no tendrán un "usuario" como tal ... –

+3

No es sospechoso. Trabajo con él y puedo asegurarle que sus propósitos son aburridamente legítimos: estamos tratando de usar dispositivos Android para advertencias de proximidad de igual a igual dentro de una flota corporativa, por lo que una solución que requiere preconfiguración es más que aceptable, por no mencionar menos abierta mal uso. –

+0

@DavidKethel encontraste alguna solución para pasar ese diálogo de permisos – Hunt

Respuesta

2

Según los comentarios, ¿realmente necesita conectarse a los dispositivos si solo desea rastrear y registrar los vehículos a su alrededor?

No sé el alcance del proyecto, pero podría simplemente usar el WifiP2pDeviceList que obtiene cuando request the peers in the WifiP2pManager. Puede obtener la lista de los dispositivos (~ = vehículos) a su alrededor y puede registrar esto.

La conexión es útil si desea enviar información más detallada, supongo.

3

Desde mi comprensión actual de la API, realmente no se pueden aceptar conexiones automáticamente sin la intervención del usuario. Puede iniciar una conexión, que no requiere la intervención del usuario. Si sus dos dispositivos son dispositivos móviles, deberá aceptar la solicitud de conexión en un extremo.

He puesto esto como una función de solicitud en el alojamiento de proyectos de Android. Puede controlar su respuesta aquí: https://code.google.com/p/android/issues/detail?id=30880

5

Se puede hacer fácilmente con la ayuda de Xposed framework. Solo necesita reemplazar el único método dentro de una de las clases de Java de Android (vea el enlace de la respuesta de snihalani). Pero, por supuesto, para usar Xposed tu dispositivo debe estar rooteado. La idea principal se puede expresar en el siguiente código (usando Xposed)

@Override 
public void handleLoadPackage(LoadPackageParam lpparam) { 
    try { 
     Class<?> wifiP2pService = Class.forName("android.net.wifi.p2p.WifiP2pService", false, lpparam.classLoader); 
     for (Class<?> c : wifiP2pService.getDeclaredClasses()) { 
      //XposedBridge.log("inner class " + c.getSimpleName()); 
      if ("P2pStateMachine".equals(c.getSimpleName())) { 
       XposedBridge.log("Class " + c.getName() + " found"); 
       Method notifyInvitationReceived = c.getDeclaredMethod("notifyInvitationReceived"); 
       final Method sendMessage = c.getMethod("sendMessage", int.class); 

       XposedBridge.hookMethod(notifyInvitationReceived, new XC_MethodReplacement() { 
        @Override 
        protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { 
         final int PEER_CONNECTION_USER_ACCEPT = 0x00023000 + 2; 
         sendMessage.invoke(param.thisObject, PEER_CONNECTION_USER_ACCEPT); 
         return null; 
        } 
       }); 

       break; 
      } 
     } 
    } catch (Throwable t) { 
     XposedBridge.log(t); 
    } 
} 

he comprobado en SGS4 de la ROM 4.2.2 y funcionó. Supongo que lo mismo podría hacerse con la ayuda de Substrate para Android.

1

Si puede modificar el marco, puede ignorar la ventana de aceptación y enviar directamente el "PEER_CONNECTION_USER_ACCEPT".

Base en Android 5.0, "frameworks/opt/net/wifi/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java".

Usted debe encontrar el "notifyInvitationReceived", y modificar a ...

private void notifyInvitationReceived() { 
    /*Direct sends the accept message.*/ 
    sendMessage(PEER_CONNECTION_USER_ACCEPT); 
/* 
... old code 
*/ 
} 
Cuestiones relacionadas