【问题标题】:Moto G dosent receive UDP packets over WIFI NetworkMoto G dosent 通过 WIFI 网络接收 UDP 数据包
【发布时间】:2017-02-03 11:16:22
【问题描述】:

我的接收器在 Moto G 中没有收到任何 UDP 数据包,但它适用于其他设备。

通过 WiFi 网络,我已成功从其他设备发送 UDP 数据包。但在 Moto E 和 Moto G 中它不起作用。

谁能帮忙弄清楚为什么它不适用于 Moto G/E?

我的问题是我没有通过 WiFi 网络接收任何 UDP 数据包。

【问题讨论】:

  • 那么你的问题是什么?

标签: android udp


【解决方案1】:

试试这个代码。这对我有用。

 public void run() {
        Looper.prepare();
        try {
          WifiManager.MulticastLock lock;
          WifiManager wifi;

          wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
          if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
          if (lock == null)
          lock = wifi.createMulticastLock("WiFi_Lock");
          lock.setReferenceCounted(true);
          lock.acquire();
         }
      }
      catch(Exception e)
      {
        Log.d("Wifi Exception",""+e.getMessage().toString());
      }
    }

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题! UDP 数据包适用于除 Moto E 以外的所有手机。然后我在 interwebz 上发现了一些非常有趣的信息。

    问题在于 Moto E(可能是 Moto G)需要应用程序获取 WifiManager.MulticastLock。来自android documentation -

    允许应用程序接收 Wifi 多播数据包。通常情况下 Wifi 堆栈过滤掉未明确发送给此的数据包 设备。获取 MulticastLock 将导致堆栈接收 发往多播地址的数据包。处理这些额外的 数据包可能会导致明显的电池消耗,应禁用 不需要时。

    您需要为您的应用添加以下权限-

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

    然后在你的代码中获取一个像这样的锁 -

    WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
    if(wifi != null){
        WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag");
        lock.acquire();
    }
    

    【讨论】:

    • 对我没用。实际上在设置监听服务器时,不需要指定任何关于 wifi 服务的内容,例如:github.com/fabriph/some-android-apps/blob/master/UDPBroadcast/…
    • 您是如何将答案嵌入到接收套接字中的?据我所知,发送广播需要该服务,但要监听,您有一个常规套接字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多