Intereting Posts
Шрифт и цвет списка виджетов Android В Android 7 (уровень API 24) моему приложению не разрешено отключать звук телефона (установить режим звонка на тихий) Gradle build failed – невозможно распаковать Студия Android – Не удалось выполнить выполнение градиента – ошибка при открытии zip-файла Пользовательское неправильное расположение курсора Android Studio 1.0.2 новый проект – Не удается разрешить символ «ActionBarActivity» "SetSupportActionBar (панель инструментов)" внутри FragmentActivity? Выровнять верхнюю часть изображения вверху TextView Android: Как удалить маркер / дополнение в Экран предпочтений Как заблокировать доступ к моему приложению для совместного использования через Bluetooth? Не удалось запустить startPreview Является ли Apple / Google спецификациями для поддержки iCal в iOS или Android? Android Hello, руководство по галерее – «R.styleable не может быть разрешен» Android AsyncTask vs Thread + Handler vs rxjava Карта Google не отображается в Android

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

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

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

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

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

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

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

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

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

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

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