Intereting Posts
Странная функция в ActivityManager: isUserAMonkey. Что это значит, каково его использование? Уведомление о плагине Cordova (java) не входит в приложение – андроид Android Studio Google-play-services library Как перейти к вложенному PreferencesScreen Android: GC не уважает SoftReferences? Не может получить доступ к памяти по адресу 0X1 после настройки gdb и eclipse для отладки общей библиотеки из приложения Android ImageView в круге через xml StaggeredGridLayoutManager переупорядочивает элементы Android добавляет дополнение между кнопками радиогруппы программно Как загружать все контакты с минимальным временем в Android Нет силы тяжести для scrollview. Как сделать контент внутри scrollview как центра Android ViewPager с ScrollViews с ViewPagers внутри ScrollViews Учебное пособие по внедрению TabHost в Android 2.2 + ViewPager и фрагментах Как создать баннер admob программно? Что является более эффективным широковещательным приемником или обработчиком?

Поддержка многоадресной рассылки на Android в режиме «Точка доступа» / «Модем»

У меня есть прототип Android-приложения, которое слушает многоадресные пакеты, чтобы «обнаружить» клиентов для общения. Настройка сокета аналогична:

InetAddress group = InetAddress.getByName("228.1.2.3"); MulticastSocket s = new MulticastSocket(4000); s.joinGroup(group); 

Это работает очень хорошо, когда все устройства подключены через WiFi. Я хотел бы поддержать это с помощью телефона, действующего как переносная точка доступа. Однако, хотя все мои устройства, похоже, правильно подключаются к точке доступа, я больше не получаю многоадресные данные. Мне интересно, существуют ли ограничения, запрещающие этот тип связи в режиме «горячей точки», или если есть какая-либо дополнительная сетевая конфигурация, необходимая для включения этого? Я пробовал это на нескольких разных устройствах, работающих с Gingerbread и Froyo, без везения.

Solutions Collecting From Web of "Поддержка многоадресной рассылки на Android в режиме «Точка доступа» / «Модем»"

Как показано в этой статье: https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket :: setNetworkInterface ()

Было бы ответом

Вы можете найти wlan0 eth:

 public static NetworkInterface getWlanEth() { Enumeration<NetworkInterface> enumeration = null; try { enumeration = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { e.printStackTrace(); } NetworkInterface wlan0 = null; StringBuilder sb = new StringBuilder(); while (enumeration.hasMoreElements()) { wlan0 = enumeration.nextElement(); sb.append(wlan0.getName() + " "); if (wlan0.getName().equals("wlan0")) { //there is probably a better way to find ethernet interface Log.i(TAG, "wlan0 found"); return wlan0; } } return null; } 

Попробуйте и дайте понять, работает ли он в режиме «Горячие точки» …

У вас есть разрешение манифеста и вы создаете блокировку?

Для получения разрешения см.: «CHANGE_WIFI_MULTICAST_STATE» в http://developer.android.com/reference/android/Manifest.permission.html

Кроме того, для создания многоадресной блокировки … см. http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html

У меня была такая же проблема, и я придумал решение из комбинации @braden, @ user707606 и главным образом сообщения Chainfire в этой ссылке .

Сообщение в ссылке приятно, но на самом деле не предлагает никаких образцов кода, но вот оно. Сначала вам необходимо приобрести Multicast Lock, это необходимо для некоторых Android-устройств, не пробовал в большинстве из них, но он упоминался в некоторых других сообщениях, поэтому я включил его в свой код.

Требуется разрешение, поэтому сначала добавьте разрешения в свой файл манифеста.

 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

Затем второй шаг – получить многоадресную блокировку в вашем методе.

 /* Acquire MultiCast Lock */ WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); multicastLock.setReferenceCounted(true); multicastLock.acquire(); 

И затем найдите свой сетевой интерфейс Wi-Fi

 /** * Finds Network Interface of Wifi Ethernet. * * @return */ public static NetworkInterface findWifiNetworkInterface() { Enumeration<NetworkInterface> enumeration = null; try { enumeration = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { e.printStackTrace(); } NetworkInterface wlan0 = null; while (enumeration.hasMoreElements()) { wlan0 = enumeration.nextElement(); if (wlan0.getName().equals("wlan0")) { return wlan0; } } return null; } 

Позже создайте многоадресный сокет с доступным портом и установите Wifi NetworkInterface.

 MulticastSocket multicastSocket = new MulticastSocket(); /* Set NetworkInterface of MultiCast Socket */ NetworkInterface wifiNetworkInterface = findWifiNetworkInterface(); if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface); 

Тогда остальная часть вашей реализации остается прежней. И как только вы закончите с Multicast Lock, рекомендуется его выпустить.