【问题标题】:Receive broadcast message on Android在 Android 上接收广播消息
【发布时间】:2013-03-18 14:44:54
【问题描述】:

首先 - 对不起我的英语,我不是“母语作家”。

我正在使用 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");
    }

当我将它编译为标准 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

有趣的是,当我在 Windows 系统下将它作为标准 Java 控制台应用程序运行时,而不是“Listen on /:: from null port true”我得到“Listen on 0.0.0.0/0.0.0.0 from null port true” .

我在清单中拥有这样的权限:

<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"/>

请帮忙!

【问题讨论】:

  • 看到这个 - code.google.com/p/boxeeremote/wiki/AndroidUDP。如果你成功了,你可以为未来的访问者回答你自己的问题。
  • 感谢您的链接。我详细地写了它,但不幸的是没有解决我的问题的建议。我在另一台使用无线通信的 PC 上尝试了这个 Java 代码,它也可以在那里工作。确定问题出在 Android 上,但仍然不知道如何解决。
  • 你实现了链接中的getBroadcastAddress方法吗?我认为您的问题是获取要绑定的地址。请记住,Android phohes 通常至少有两个接口 - WiFi 和移动设备。
  • 正如我在示例中看到的,getBroadcastAddress 仅用于发送。我只需要实现接收,根本不调用 getBroadcastAddress 方法。无论如何,我尝试调用此方法,但在我的设备上失败了。
  • 啊,是的,你是对的。但是该方法是在文章的上一段中声明的,所以可能这就是它不起作用的原因:)

标签: java android sockets udp broadcast


【解决方案1】:

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

著名的代码here 对我不起作用,我建议的 2 解决方案也对我不起作用,因为它取决于您的设备和操作系统

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

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

WifiManager wifi;
wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock mLock = wifi.createMulticastLock("lock");
mLock.acquire();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多