在像素2和像素2 XL处接收UDP广播数据包

在像素2和像素2 XL处接收UDP广播数据包,udp,broadcast,Udp,Broadcast,我正在开发一个从Wi-Fi摄像头接收UPD广播数据包的应用程序。 在我发现在谷歌Pixel 2/Pixel 2 XL接收UPD广播数据包时出现问题之前,情况一直很好 为了找出原因,我做了两个测试应用程序:一个是UPD广播发送器(),另一个是UDP广播接收器() 我在一些安卓设备上测试了它们,发现Google Pixel 2/Pixel 2 XL无法接收UDP广播数据包。除了Pixel 2/Pixel 2 XL以外的Android设备工作正常。安卓8.1上的Nexus也运行良好 我试图搜索类似的问

我正在开发一个从Wi-Fi摄像头接收UPD广播数据包的应用程序。 在我发现在谷歌Pixel 2/Pixel 2 XL接收UPD广播数据包时出现问题之前,情况一直很好

为了找出原因,我做了两个测试应用程序:一个是UPD广播发送器(),另一个是UDP广播接收器()

我在一些安卓设备上测试了它们,发现Google Pixel 2/Pixel 2 XL无法接收UDP广播数据包。除了Pixel 2/Pixel 2 XL以外的Android设备工作正常。安卓8.1上的Nexus也运行良好

我试图搜索类似的问题,并发现了一些问题,如 Android 8.0()上未接收到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();
}
   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;
               }
            }
         }
      }
   }
下面是关于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();
}
   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;
               }
            }
         }
      }
   }
有没有人经历过这个问题并解决了它?
高级版谢谢。

我在Pixel 2 XL上遇到了同样的问题。 我添加了一个Wifi多播锁,以便能够收听UDP广播的消息

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
并在Android清单中添加了此权限:

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


但像素2(XL)上的UDP广播接收似乎只是偶尔工作。我还没有找到一个模式,它似乎是随机的。我知道UDP并不意味着可靠,但同一Wifi LAN上的所有其他设备都能完美地接收UDP广播数据包,而不会丢失。

尝试[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"/>

我也看到了这一点,没有找到解决方案