我正在开发一个从Wi-Fi相机接收UPD广播包的应用程序。 在我发现在Google Pixel 2 / Pixel 2 XL上接收UPD广播数据包的问题之前,它曾经很好。
为了找出原因,我制作了2个测试应用程序:一个是UPD广播发送者(https://senatech.box.com/s/gmhr391pbl32lqai0mhkffyk6j0ckle5),另一个是UDP广播接收者(https://senatech.box.com/s/abamuor47nlafocs035nfuj90d0uvx0m)。
我在一些Android设备上测试了它们,发现Google Pixel 2 / Pixel 2 XL无法恢复UDP广播数据包。除Pixel 2 / Pixel 2 XL之外的Android设备运行良好。 Android 8.1上的Nexus也运行良好。
我试图搜索类似的问题,我发现了一些如此 在Android 8.0(https://bugreports.qt.io/browse/QTBUG-64233)上未收到UDP广播数据包。 我认为这可能是由同一问题造成的,尽管它是用QT编写的。
以下是UDP广播发送者的简要代码
public void sendUPDBroadcast() {
Thread thread = new Thread() {
@Override
public void run() {
DatagramSocket ds = null;
int port = 0;
String udpData = "";
try {
port = Integer.parseInt(etPort.getText().toString());
udpData = etUDPData.getText().toString();
InetAddress ia = InetAddress.getByName("192.168.255.255");
ds = new DatagramSocket(port);
DatagramPacket data = new DatagramPacket(udpData.getBytes(), udpData.getBytes().length, ia, port);
ds.send(data);
} catch(Exception e) {
} finally {
if (ds != null) {
ds.close();
ds = null;
}
}
}
};
thread.start();
}
以下是UDP广播发送者的简要代码
packet = new DatagramPacket(buffer, buffer.length);
socket = new DatagramSocket(port);
socket.setBroadcast(true);
@Override
public void run() {
try {
while (alive) {
try {
packet.setLength(buffer.length);
socket.receive(packet);
String s = stringFromPacket(packet);
} catch (java.io.InterruptedIOException e) {
} catch (java.io.IOException ex) {
} catch (Exception allException) {
} finally {
if (socket != null)
socket.close();
socket = null;
}
}
}
}
}
有没有人遇到过这个问题并修复它? 先谢谢你。
答案 0 :(得分:2)
尝试[Ruud van Reenen]的解决方案,结果好坏参半。但是,在添加了一些其他权限并启用了引用计数之后,它对我来说更加可靠。这是我的代码:
WifiManager wm = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("RavnApplication");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
...
// don't forget to release when you're done...
if (multicastLock != null) {
multicastLock.release();
multicastLock = null;
}
以及其他清单权限。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
答案 1 :(得分:0)
Pixel 2 XL遇到了同样的问题。 我已经添加了一个Wifi Multicast锁,以便能够收听UDP广播的消息。
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
并在Android Manifest中添加了此权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
但Pixel 2(XL)上的UDP广播接收似乎只是偶尔使用。我还没有找到一个模式,似乎是随机的。我知道UDP并不是可靠的,但是同一个Wifi LAN上的所有其他设备都能完美地接收UDP广播数据包而不会丢失。