我有一些在Android上工作了几年的网络代码。现在,运行Android 6.0的设备只能部分工作。我还从用户那里得到了关于在三星Tab S2上运行时可能由相同问题导致的问题的报告,但我不知道他们正在运行的操作系统版本。基本上,这些设备似乎传输得很好,但实际上并没有收到任何数据。同一网络上的其他设备可以毫无问题地发送和接收数据。但有些警告(请参阅下文),但设置正常。Android多播工作非常不可靠
我猜目前为止,我的Android 6.0设备没有正确加入多播组。但是这并不能解释为什么一台路由器似乎工作正常。任何想法如何解决它,以便所有有效的多播地址正常工作?如果没有修复,那么为非路由消息使用保留的224.0.0.251地址有多糟?
设备:
A - 注5运行的是Android 5.1.1
乙 - NVIDIA SHIELD平板运行Android 6.0
路由器:
X - WIFI的Linksys EA4500路由器
Ÿ - WIFI的Windows 10的PC主机网络
发现:
1 - UDP/TCP单播似乎工作两个设备和路由器上细
2 - UDP多播工作机智h路由器X上的224.0.0.251(未尝试路由器Y)
3 - UDP多播在路由器Y上工作,地址为239.2.3.1
4 - 地址为239.2.3.1的UDP多播或任何其他有效地址我试过,部分在路由器X上工作。设备A可以tx/rx,设备B只能tx。
我有关清单的权限:
<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
}
你更新你的应用程序要求对运行时的权限? http://developer.android.com/intl/es/training/permissions/requesting.html – AndroidRuntimeException