Как автоматически принимать Wi-Fi Прямые запросы на подключение в Android

У меня есть 2 устройства Android, использующие WiFi Direct. На одном устройстве я могу получить информацию о другом устройстве с помощью класса WifiP2pManager и запросить подключение к другому устройству. Однако, когда я запрашиваю соединение, другое устройство вытаскивает небольшое окно и спрашивает пользователя, хотят ли они принять запрос на соединение.

Можно ли автоматически принимать эти запросы на соединение? I.E, чтобы иметь возможность подключаться к другому устройству без подтверждения пользователя?

Ответ 1

На основе комментариев вам действительно нужно подключиться к устройствам, если вы просто хотите отслеживать и регистрировать транспортные средства вокруг вас?

Я не знаю рамки проекта, но вы можете просто использовать WifiP2pDeviceList, который вы получите, когда вы запрашивать одноранговые узлы в WifiP2pManager. Вы можете получить список устройств (~ = транспортные средства) вокруг вас и можете зарегистрировать это.

Соединение полезно, если вы хотите отправить более подробную информацию, я думаю.

Ответ 2

Это можно легко сделать с помощью Xposed framework. Вам просто нужно заменить один метод внутри одного из классов Java 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, и он работал. Я думаю, что то же самое можно сделать с помощью Substrate для Android.

Ответ 3

Из моего нынешнего понимания API, вы не можете принимать соединения автоматически без вмешательства пользователя. Вы можете инициировать соединение, которое не требует вмешательства пользователя. Если оба устройства являются мобильными устройствами, вам необходимо будет принять запрос на соединение с одного конца.

Я поставил это как запрос функции в хостинг проектов Android. Вы можете отслеживать их ответ здесь: https://code.google.com/p/android/issues/detail?id=30880

Ответ 4

Если вы можете изменить фреймворк, вы можете проигнорировать окно 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
*/
}

Ответ 5

Процесс рутирования Android решает большинство проблем с Wi-Fi без каких-либо проблем. Прямо сейчас этот процесс рутинга Android дает лучший пользовательский опыт с выдающимся инструментом, который является Magisk Apk, просто Magisk Apk является лучшим вариантом, и это единственный инструмент рутирования Android, который может использоваться для любого устройства Android.