2012-05-11 9 views
9

Ho 2 dispositivi Android tramite WiFi Direct. Su un dispositivo posso ottenere informazioni sull'altro dispositivo usando la classe WifiP2pManager e richiedere una connessione all'altro dispositivo. Tuttavia quando richiedo una connessione, l'altro dispositivo apre una piccola finestra e chiede all'utente se vuole accettare la richiesta di connessione.Come accettare automaticamente le richieste di connessione Wi-Fi Direct in Android

È possibile accettare automaticamente queste richieste di connessione? I.E essere in grado di connettersi all'altro dispositivo senza la conferma dell'utente?

+2

posso apprezzare come questo suona un po 'sospetto. Come se stessi cercando di connettermi al dispositivo senza che l'utente lo sappia. Ma stiamo valutando la possibilità di utilizzare dispositivi Android come base per il tracciamento e la registrazione dei veicoli. Quindi questi dispositivi non hanno un "utente" come tale ... –

+3

Non è un pesce. Lavoro con lui e posso assicurarti che i suoi scopi sono noiosamente legittimi - stiamo cercando di utilizzare dispositivi Android per avvisi di prossimità peer to peer all'interno di una flotta aziendale - quindi una soluzione che richiede preconfigurazione è più che accettabile, per non dire meno aperta abusare. –

+0

@DavidKethel hai trovato qualche soluzione per passare quella finestra di autorizzazione – Hunt

risposta

2

In base ai commenti, è davvero necessario connettersi ai dispositivi se si desidera solo monitorare e registrare i veicoli che vi circondano?

Non conosco l'ambito del progetto, ma è sufficiente utilizzare lo WifiP2pDeviceList che si ottiene quando si è request the peers in the WifiP2pManager. Si potrebbe ottenere l'elenco dei dispositivi (~ = veicoli) intorno a te e potrebbe registrare questo.

La connessione è utile se si desidera inviare informazioni più dettagliate, credo.

3

Dalla mia attuale comprensione dell'API, non è possibile accettare le connessioni automaticamente senza l'intervento dell'utente. È possibile avviare una connessione, che non richiede l'intervento dell'utente. Se entrambi i tuoi dispositivi sono dispositivi mobili, dovrai accettare la richiesta di connessione da un lato.

Ho inserito questo come richiesta di funzionalità nell'hosting di progetti Android. Qui è possibile monitorare la loro risposta: https://code.google.com/p/android/issues/detail?id=30880

5

Può essere facilmente fatto con l'aiuto di Xposed framework. Hai solo bisogno di sostituire il singolo metodo all'interno di una delle classi java di Android (vedi il link dalla risposta di snihalani). Ma ovviamente per usare Xposed il tuo dispositivo deve essere rootato. L'idea principale può essere espresso nel seguente codice (utilizzando 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); 
    } 
} 

ho testato su SGS4 magazzino 4.2.2 ROM e ha funzionato. Credo che lo stesso potrebbe essere fatto con l'aiuto di Substrate per Android.

1

Se è possibile modificare il framework, è possibile ignorare la finestra di accettazione e inviare direttamente "PEER_CONNECTION_USER_ACCEPT".

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

È necessario trovare il "notifyInvitationReceived", e modificare a ...

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