是否有CHANGE_WIFI_MULTICAST_STATE权限和使用WifiManager.MulticastLock需要在Android上接收多播数据包?

我有一个测试应用程序,我用它来演示多播流量是否进入
Android设备.我看到的行为似乎与Google的文档
here
here相矛盾,这意味着为了让应用程序接收多播流量,需要有两个先决条件:

>获取MulticastLock
>将CHANGE_WIFI_MULTICAST_STATE权限添加到应用程序的清单中

我的应用程序能够在没有这些项目的情况下接收多播流量.下面是设置用于接收数据的多播套接字的代码段.

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 );

这应该发生吗?我是否能够在没有2个先决条件的情况下接收多播数据包?我注意到MulticastLock文档说:

Normally the Wifi stack filters out packets not explicitly addressed to this device

这是否意味着从一个设备到另一个设备的行为可能不同?我在运行Android 4.4.4版的三星Galaxy Note4(型号SM-N910T)上测试我的应用程序.对此问题的任何澄清将不胜感激.

最佳答案 WifiManager.MulticastLock获取后,将修改设备上的Wifi接口状态(gobally),以允许所有应用程序接收多播流量.如果您的应用想要获取此锁,您的应用将需要CHANGE_WIFI_MULTICAST_STATE权限.

在您的情况下,如果在未获取此锁定的情况下收到多播流量,则必须表示此类型

(1)其他一些应用已获得此锁,因此,接口现在正在解析/过滤并传送多播数据包.

要么

(2)设备制造商在开发设备时忽略了这个android api,接口总是提供所有组播流量.

API的描述不会强制制造商仅在应用获得此锁定时允许多播流量.

无论如何,如果应用程序想要可靠地接收多播流量,则必须获取此锁定.

点赞