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

问题描述 投票:0回答:5

我有 2 台使用 WiFi Direct 的 Android 设备。在一台设备上,我可以使用

WifiP2pManager
类获取有关另一台设备的信息,并请求连接到另一台设备。但是,当我请求连接时,其他设备会弹出一个小窗口,询问用户是否要接受连接请求。

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

android wifi-direct wifip2p
5个回答
5
投票

借助Xposed框架可以轻松完成。您只需要替换 android java 类之一中的单个方法(请参阅 snihalani 的答案中的链接)。当然,要使用 Xpose,您的设备必须已 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 stock 4.2.2 ROM 上测试了它并且它有效。 我想在 Android 的 Substrate 的帮助下也可以完成同样的事情。


3
投票

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

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


2
投票

根据评论,如果您只是想跟踪和记录周围的车辆,您真的需要连接到设备吗?

我不知道该项目的范围,但您可以简单地使用当您在WifiP2pManager中请求对等点时获得的WifiP2pDeviceList。您可以获得您周围的设备(~=车辆)列表并可以记录它。

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


2
投票

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

0
投票

如果有人想在设备上直接使用 Wi-Fi,而没有请求接受邀请的许可,您可以保证无论他们说什么,他们都没有好意,所以如果他们请求许可怎么办,这不会打扰用户,所以人们可以假设他们恶意想要这些信息,以某种方式欺骗、误导或欺骗个人,不要让这种情况欺骗你

© www.soinside.com 2019 - 2024. All rights reserved.