在Android上接收广播消息

C D*_*C D 6 java sockets android udp broadcast

首先 - 抱歉我的英语,我不是"本土作家".

我正在用C++发送广播消息,并希望在Android设备上接收它.我创建了这样的代码:

    System.out.println("receiveBroadcast()");
    DatagramSocket socket = new DatagramSocket(3866);
    socket.setBroadcast(true);
    System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast());
    byte[] buf = new byte[512];
    DatagramPacket packet = new DatagramPacket(buf, buf.length);
    while (true) {
      System.out.println("Waiting for data");
      socket.receive(packet);
      System.out.println(packet.getAddress());
      System.out.println("Data received");
    }
Run Code Online (Sandbox Code Playgroud)

当我将其编译为标准的Java SE控制台应用程序并在连接到网络的其他计算机上运行时,它可以工作.它不适用于Android,我不知道为什么.在Android上它只是等待数据但从未收到它:

03-18 15:47:05.045: I/System.out(16651): receiveBroadcast()
03-18 15:47:05.055: I/System.out(16651): Listen on /:: from null port true
03-18 15:47:05.065: I/System.out(16651): Waiting for data
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我在Windows系统下将其作为标准Java控制台应用程序运行时,而不是"侦听/ ::从null端口为真"我得到"从空端口侦听0.0.0.0/0.0.0.0上的真实".

我有清单这样的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />   
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)

请帮忙!

Sei*_*deb 0

我知道这是一个旧线程,但我想我在这里分享它,因为将来它可能会帮助其他人。

这里写的著名代码对我不起作用,我建议的第二种解决方案也不起作用,因为它取决于您的设备和操作系统

无论如何,你们可能想尝试以下一些解决方案:

1-在你的wifi上创建一个锁,这样它就不会在一段时间不活动后被关闭

WifiManager wifi;
wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock mLock = wifi.createMulticastLock("lock");
mLock.acquire();
Run Code Online (Sandbox Code Playgroud)

2-在此处检查此链接,因为在某些情况下广播消息会被操作系统阻止