我有一个测试应用程序,我正在使用它来演示多播流量是否正在进入Android设备。我看到的行为似乎与谷歌的文档herehere相矛盾,这意味着要让应用程序接收多播流量,需要具备两个先决条件:
获取多播锁
将更改WiFi多播状态权限添加到应用程序的清单
我的应用程序可以接收多播流量,而不需要这些项目。下面是设置多播套接字以接收数据的代码段。

MulticastSocket multicastReceiveSocket = new MulticastSocket( 18200 );
multicastReceiveSocket.joinGroup( InetAddress.getByName( "232.232.232.232" ) );

byte[] buffer = new byte[ 65536 ];
DatagramPacket packet = new DatagramPacket( buffer, buffer.length );
multicastReceiveSocket.receive( packet );

应该这样吗?我是否应该能够接收多播数据包,而不需要两个先决条件中的任何一个?我注意到MulticastLock文档说:
通常,wifi堆栈会过滤出未明确指向此设备的数据包
这是否意味着不同设备的行为可能不同?我正在运行Android 4.4.4版的三星Galaxy Note4(型号SM-N910T)上测试我的应用程序。如能就此问题作出任何澄清,将不胜感激。

最佳答案

wifimanager.multicastlock在获取时,将修改设备上wifi接口的状态(gobaly),以允许所有应用程序接收多播流量。如果您的应用程序要获取此锁,则需要更改WiFi多播状态权限。
在您的情况下,如果在未获取此锁的情况下接收到多播通信,则必须表示
(1)其他一些应用程序已经获得了这个锁,因此,接口现在也在解析/过滤和传送多播数据包。

(2)设备制造商在开发设备时忽略了这个android api,接口总是提供所有的多播流量。
API的描述不会强制制造商仅在应用程序获取此锁时才允许多播通信。
无论如何,如果应用程序想要可靠地接收多播通信,它们必须获得这个锁。

07-24 09:48
查看更多