2012-05-11 94 views
9

我有2個使用WiFi Direct的Android設備。在一臺設備上,我可以使用WifiP2pManager類獲得有關其他設備的信息,並請求連接到其他設備。但是,當我請求連接時,另一臺設備會彈出一個小窗口,詢問用戶是否要接受連接請求。如何在Android中自動接受Wi-Fi Direct連接請求

是否可以自動接受這些連接請求? I.E能夠在沒有用戶確認的情況下連接到其他設備?

+2

我能體會如何聽起來有點可疑。就像我試圖連接到用戶不知道的設備一樣。但我們正在考慮使用Android設備作爲車輛跟蹤和記錄的基礎的可能性。所以這些設備不會有這樣的「用戶」...... –

+3

它不腥。我和他一起工作,我可以向你保證他的目的是無聊的合法 - 我們正試圖使用​​Android設備在公司車隊內進行對等接近警告 - 所以需要預配置的解決方案不僅僅是可以接受的,更不用說更少開放濫用。 –

+0

@DavidKethel是否找到任何解決方案來傳遞該權限對話框 – Hunt

回答

2

根據評論,如果你只是想跟蹤和記錄你周圍的車輛,你真的需要連接到設備嗎?

我不知道該項目的範圍,但你可以簡單地使用當你request the peers in the WifiP2pManager時得到的WifiP2pDeviceList。你可以得到你周圍的設備列表(〜=車輛)並記錄下來。

如果您想發送更多詳細信息,連接很有用。

3

根據我目前對API的理解,如果沒有用戶的干預,您無法真正接受連接。您可以啓動連接,不需要用戶干預。如果您的兩個設備都是移動設備,則必須在一端接受連接請求。

我已經把這個作爲一個功能請求在android項目託管。 你可以在這裏監控他們的迴應:https://code.google.com/p/android/issues/detail?id=30880

5

它可以很容易地完成在Xposed framework的幫助下。你只需要替換android java類中的單個方法(參見snihalani答案的鏈接)。但是,當然要使用Xposed,你的設備必須是紮根的。主要思想可以用下面的代碼表示(使用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); 
    } 
} 

我在SGS4股票4.2.2 ROM上測試它,它工作。 我想在Android的Substrate的幫助下可以完成相同的操作。

1

如果您可以修改框架,您可以忽略接受窗口並直接發送「PEER_CONNECTION_USER_ACCEPT」。

基於Android 5.0,「frameworks/opt/net/wifi/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java」。

你必須找到「notifyInvitationReceived」,並修改...

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