如何在Android上自动接受Wi-Fi Direct连接请求

11

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

是否可能自动接受这些连接请求?也就是说,能否在没有用户确认的情况下连接到另一个设备?


2
我能理解这听起来有点可疑。好像我试图在用户不知情的情况下连接到设备一样。但我们正在考虑使用Android设备作为车辆跟踪和记录的基础,因此这些设备不会有“用户”这样的存在... - David Kethel
3
没问题。我与他合作,可以保证他的目的毫无问题——我们试图在企业车队中使用Android设备进行点对点警告,所以需要预配置的解决方案是可以接受的,更不易被滥用。可以放心,这件事情一点儿也不可疑。 - Peter Wone
@DavidKethel,你找到通过那个权限对话框的解决方案了吗? - Hunt
4个回答

5

借助Xposed框架,可以轻松完成。您只需要替换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上测试过,它可以正常工作。 我猜在Android中也可以通过Substrate的帮助下实现。


3
从我的理解来看,API无法自动接受连接而不需要用户干预。您可以发起一个连接,这不需要用户干预。如果两台设备都是移动设备,则必须在一端接受连接请求。
我已将此作为功能请求提交给Android项目托管。您可以在此处监视他们的响应:https://code.google.com/p/android/issues/detail?id=30880

2

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

2
根据评论,如果您只想跟踪和记录周围的车辆,那么您真的需要连接设备吗?我不知道项目的范围,但您可以简单地使用WifiP2pDeviceList,当您请求WifiP2pManager中的对等点时,您可以获取设备(~=车辆)周围的列表,并且可以记录这一点。如果您想发送更详细的信息,则连接很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接