我的接收器在Moto G中没有收到任何UDP数据包,但它适用于其他设备。
通过WiFi网络,我已成功从其他设备发送UDP数据包。但是在Moto E和Moto G中它没有用。
任何人都可以帮忙弄明白为什么它不能用于Moto G / E吗?
我的问题是我没有通过WiFi网络接收任何UDP数据包。
答案 0 :(得分:4)
我遇到了完全相同的问题!除了Moto E之外,每个电话都可以使用UDP数据包。然后我在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();
}
答案 1 :(得分:2)
试试这段代码。这对我有用。
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());
}
}