【问题标题】:How to auto-accept Wi-Fi Direct connection requests in Android如何在 Android 中自动接受 Wi-Fi Direct 连接请求
【发布时间】:2012-05-19 16:03:48
【问题描述】:

我有 2 台使用 WiFi Direct 的 Android 设备。在一台设备上,我可以使用WifiP2pManager 类获取有关另一台设备的信息,并请求连接到另一台设备。但是,当我请求连接时,另一台设备会弹出一个小窗口并询问用户是否要接受连接请求。

是否可以自动接受这些连接请求? I.E 无需用户确认即可连接到其他设备?

【问题讨论】:

  • 我可以理解这听起来有点可疑。就像我试图在用户不知道的情况下连接到设备一样。但我们正在研究使用安卓设备作为车辆跟踪和记录基础的可能性。所以这些设备不会有这样的“用户”......
  • 这不是鱼腥味。我和他一起工作,我可以向你保证他的目的是合法的——我们正在尝试使用 Android 设备在公司车队中进行点对点接近警告——所以需要预先配置的解决方案是完全可以接受的,更不用说不那么开放了滥用。
  • @DavidKethel 你有没有找到任何解决方案来传递该权限对话框

标签: android wifi-direct wifip2p


【解决方案1】:

基于 cmets,如果您只想跟踪和记录您周围的车辆,您真的需要连接到设备吗?

我不知道该项目的范围,但您可以简单地使用request the peers in the WifiP2pManager 时获得的WifiP2pDeviceList。您可以获取您周围的设备(~= 车辆)列表并记录下来。

如果您想发送更详细的信息,我猜连接很有用。

【讨论】:

    【解决方案2】:

    根据我目前对 API 的理解,如果没有用户的干预,您无法真正自动接受连接。您可以发起连接,无需用户干预。如果您的两台设备都是移动设备,则您必须在一端接受连接请求。

    我已将此作为 android 项目托管中的功能请求。 您可以在这里查看他们的回复:https://code.google.com/p/android/issues/detail?id=30880

    【讨论】:

      【解决方案3】:

      Xposed framework 的帮助下可以轻松完成。您只需要替换其中一个 android java 类中的单个方法(请参阅 snihalani 答案中的链接)。当然,要使用 Xposed,您的设备必须是 root 的。主要思想可以用以下代码表达(使用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 上对其进行了测试,它工作正常。 我想同样可以在Substrate for android 的帮助下完成。

      【讨论】:

        【解决方案4】:

        如果可以修改框架,可以忽略接受窗口,直接发送“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
        */
        }
        

        【讨论】:

          猜你喜欢
          • 2015-04-22
          • 1970-01-01
          • 2017-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多