在Android上接收多播数据包是否需要更改WIFI多播状态权限和使用WifiManager.MulticastLock?

在Android上接收多播数据包是否需要更改WIFI多播状态权限和使用WifiManager.MulticastLock?,android,multicast,Android,Multicast,我有一个测试应用程序,我正在使用它来演示多播流量是否正在进入Android设备。我看到的行为似乎与谷歌的文档相矛盾,这意味着应用程序需要具备两个先决条件才能接收多播流量: 获取多播锁 将更改\u WIFI\u多播\u状态权限添加到应用程序的清单中 我的应用程序能够在没有这些项目的情况下接收多播流量。下面是设置多播套接字以接收数据的代码片段 MulticastSocket multicastReceiveSocket = new MulticastSocket( 18200 ); multicas

我有一个测试应用程序,我正在使用它来演示多播流量是否正在进入Android设备。我看到的行为似乎与谷歌的文档相矛盾,这意味着应用程序需要具备两个先决条件才能接收多播流量:

  • 获取多播锁
  • 将更改\u WIFI\u多播\u状态权限添加到应用程序的清单中
  • 我的应用程序能够在没有这些项目的情况下接收多播流量。下面是设置多播套接字以接收数据的代码片段

    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)上测试我的应用程序。对此问题的任何澄清都将不胜感激。

    MultiCastLock类用于通过wifi manager接收多播信号(接入点探测除外)。这些数据包可以是其他支持wifi的设备探测信号以及被wifi卡捕获的类似数据包


    这里你描述的是一个完全不同的东西。您只需监听特定的套接字并收集在连接的网络中流动的数据包。

    WifiManager.MulticastLock在获取时,将修改设备上Wifi接口的状态(Gobaly),以允许所有应用程序接收多播流量。如果你的应用想获得此锁,你的应用需要更改\u WIFI\u多播\u状态权限

    在您的情况下,如果接收到多播通信量而没有获取此锁,则这意味着

    (1) 其他一些应用程序已经获得了该锁,因此,该接口现在也在解析/过滤和交付多播数据包

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

    API的描述并不强制制造商仅在应用程序获得此锁时才允许多播通信


    无论如何,如果应用程序想要可靠地接收多播流量,就必须获得该锁。

    就像安卓系统上的其他不幸的事情一样,这取决于设备

    在添加此权限并获得多播锁后,我可以在使用Android 4.4.2 KitKat的Motorola XT890(RAZRi)上开始接收UDP广播数据包

    对于我的三星和Nexus设备,这是没有必要的

    显然,其他摩托罗拉设备也有这个问题: