【发布时间】:2016-03-06 20:28:25
【问题描述】:
我有一些在 Android 中运行了几年的网络代码。现在,使用运行 Android 6.0 的设备,它只能部分工作。我还收到了用户的报告,他们在三星 Tab S2s 上运行时可能会出现同样的问题,但我不知道他们运行的是什么操作系统版本。基本上,这些设备似乎传输得很好,但它们实际上没有收到任何数据。同一网络上的其他设备可以毫无问题地发送和接收。不过,有一些警告(见下文)可以正常工作。
到目前为止,我能猜到的最好的结果是我的 Android 6.0 设备没有正确加入多播组。但这并不能解释为什么一台路由器似乎工作正常。任何想法如何解决它,以便所有有效的多播地址都能正常工作?如果没有修复,将保留的 224.0.0.251 地址用于非路由消息有多糟糕?
设备:
A - 运行 Android 5.1.1 的 Note 5
B - 运行 Android 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"/>
这是适用于我使用过的所有其他设备的简化代码:
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
}
【问题讨论】:
-
您是否更新了您的应用程序以请求运行时权限? developer.android.com/intl/es/training/permissions/…
标签: android networking android-6.0-marshmallow multicast android-permissions