【发布时间】:2017-02-03 11:16:22
【问题描述】:
我的接收器在 Moto G 中没有收到任何 UDP 数据包,但它适用于其他设备。
通过 WiFi 网络,我已成功从其他设备发送 UDP 数据包。但在 Moto E 和 Moto G 中它不起作用。
谁能帮忙弄清楚为什么它不适用于 Moto G/E?
我的问题是我没有通过 WiFi 网络接收任何 UDP 数据包。
【问题讨论】:
-
那么你的问题是什么?
我的接收器在 Moto G 中没有收到任何 UDP 数据包,但它适用于其他设备。
通过 WiFi 网络,我已成功从其他设备发送 UDP 数据包。但在 Moto E 和 Moto G 中它不起作用。
谁能帮忙弄清楚为什么它不适用于 Moto G/E?
我的问题是我没有通过 WiFi 网络接收任何 UDP 数据包。
【问题讨论】:
试试这个代码。这对我有用。
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());
}
}
【讨论】:
我遇到了完全相同的问题! 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();
}
【讨论】: