我遇到了同样的问题,并通过@braden、@user707606 和 Chainfire 在此链接中的主要帖子的组合提出了解决方案。
在链接中发布很好,但实际上并没有提供任何代码示例,但在这里。首先你需要获取组播锁,这对于一些安卓设备是必需的,大部分都没有尝试过,但在其他一些帖子中提到过,所以我已经将它包含在我的代码中。
需要权限,所以首先,将权限添加到您的清单文件中。
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
然后第二步是在您的方法中获取多播锁定。
/* Acquire MultiCast Lock */
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
然后,找到您的 Wifi 网络接口
/**
* Finds Network Interface of Wifi Ethernet.
*
* @return
*/
public static NetworkInterface findWifiNetworkInterface() {
Enumeration<NetworkInterface> enumeration = null;
try {
enumeration = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
}
NetworkInterface wlan0 = null;
while (enumeration.hasMoreElements()) {
wlan0 = enumeration.nextElement();
if (wlan0.getName().equals("wlan0")) {
return wlan0;
}
}
return null;
}
稍后,创建一个具有可用端口的多播套接字并设置您的 Wifi NetworkInterface。
MulticastSocket multicastSocket = new MulticastSocket();
/* Set NetworkInterface of MultiCast Socket */
NetworkInterface wifiNetworkInterface = findWifiNetworkInterface();
if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface);
然后你的实施的其余部分保持不变。完成多播锁定后,建议释放它。