Android多播运行非常不可靠

Android多播运行非常不可靠,android,networking,android-6.0-marshmallow,multicast,android-permissions,Android,Networking,Android 6.0 Marshmallow,Multicast,Android Permissions,我有一些网络代码,已经在Android上运行了几年。现在,有了运行安卓6.0的设备,它只能部分工作。我还收到用户的报告,他们在三星Tab S2s上运行时可能会遇到同样的问题,但我不知道他们运行的是什么操作系统版本。基本上,这些设备似乎传输得很好,但它们从未真正接收到任何数据。同一网络上的其他设备可以毫无问题地进行发送和接收。不过,在设置工作正常的情况下,还有一些警告(请参见下文) 到目前为止,我能猜到的最好的情况是,我的安卓6.0设备没有正确加入多播组。但这并不能解释为什么一个路由器似乎工作正常

我有一些网络代码,已经在Android上运行了几年。现在,有了运行安卓6.0的设备,它只能部分工作。我还收到用户的报告,他们在三星Tab S2s上运行时可能会遇到同样的问题,但我不知道他们运行的是什么操作系统版本。基本上,这些设备似乎传输得很好,但它们从未真正接收到任何数据。同一网络上的其他设备可以毫无问题地进行发送和接收。不过,在设置工作正常的情况下,还有一些警告(请参见下文)

到目前为止,我能猜到的最好的情况是,我的安卓6.0设备没有正确加入多播组。但这并不能解释为什么一个路由器似乎工作正常。有没有办法修复它,使所有有效的多播地址都能正常工作?如果没有修复程序,将保留的224.0.0.251地址用于非路由邮件有多糟糕

设备:
注5运行Android 5.1.1
B-运行安卓6.0的nVidia Shield平板电脑

路由器:
X-WIFI Linksys EA4500路由器
Y-WIFI Windows 10 PC托管网络

调查结果:
1-UDP/TCP单播似乎在设备和路由器上都能正常工作
2-UDP多播与路由器X上的224.0.0.251配合使用(未尝试路由器Y)
3-UDP多播在路由器Y上工作,地址为239.2.3.1
4-地址为239.2.3.1或我尝试过的任何其他有效地址的UDP多播在路由器X上部分工作。设备A可以发送/接收,设备B只能发送。

我的相关清单权限:

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

默认情况下,在5.0及更高版本中禁用多播。。。我不知道谷歌为什么会这么做。但我能找到的唯一解决方案是闪存一个支持多播的定制内核


您还可以尝试将多播转换为单播

默认情况下,5.0及更高版本中禁用了多播。。。我不知道谷歌为什么会这么做。但我能找到的唯一解决方案是闪存一个支持多播的定制内核


您也可以尝试将多播转换为单播

您是否已更新应用程序以请求运行时的权限?您是否已更新应用程序以请求运行时权限?这需要引用这需要引用
try
{
    mRxSocket = new MulticastSocket( APort );

    mRxSocket.joinGroup( AMulticastAddress );

    mRxSocket.setSoTimeout( 0 );

    final WifiManager wm = (WifiManager)getSystemService( Context.WIFI_SERVICE );

    mMyMulticastLock = wm.createMulticastLock( "WAKELOCK_STRING" );
    mMyMulticastLock.acquire();

    int maxPacketSize = 1024*64;
    final byte packetBuffer[] = new byte[maxPacketSize];
    final DatagramPacket packet = new DatagramPacket( packetBuffer, maxPacketSize );

    mRxSocket.receive( packet );

    // it never gets past the receive call.  No data is ever received by this thread...
}
catch( final IOException e )
{
    mRxSocket = null;

    //connection failed

    //never gets here unless the network is disconnected
}