关于部分Android手机厂商默认关闭系统UDP问题解决方案
关于部分Android手机厂商默认关闭系统UDP问题解决方案
作者:贺有江
时间:2019-05-14
目录
- 前言
- 背景
- 问题
- 解决方案
前言
??本文档主要面向Android端研发同学,所有涉及到UDP数据收发的场景均可参照借鉴;
背景
??在项目后期,测试组在使用谷歌Pixel 2 手机测试Android端SoftAp配网时,发现SoftAp配网每次均出现配网超时错误提示,测试组自行有尝试更换路由器、4G热点等措施,均为同样错误提示信息。App/Wi-Fi端通过log可以确定,SoftAp配网期间Wi-Fi 端和App端的TCP可以正常连接并通信,但是始终未收到来自Wi-Fi端的广播数据报文,App端也曾提供单独的UDP Demo App协助测试组测试该问题,但均以失败告终,仔细排查后,发现是因为“谷歌Pixel 2 手机”对系统进行了优化,默认关闭了系统所有UDP广播功能;(猜测是由于手机开启UDP广播功能不仅耗电,而且占用系统资源。)
问题
??Android部分手机厂商(例如:“谷歌Pixel 2 手机”)对手机系统进行了优化,默认关闭了系统所有UDP广播功能;
解决方案
??1.在使用UDP接收数据之前先实例化一个WifiManager.MulticastLock对象wifiLock,并调用wifiLock.acquire()锁定Wi-Fi多播。
WifiManager manager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock wifiLock= manager.createMulticastLock("localWifi");
wifiLock.acquire();
2.在AndroidManifest.xml中加入如下权限:
通过如上两步操作,手机就可以正常收发UDP广播数据了;
3.在UDP数据通信结束后,需要将Wi-Fi锁主动释放掉;
if (null != wifiLock) wifiLock.release();
//必须调用
wifiLock必须释放,否则会造成如下异常;如果多次调用wifiLock.acquire(),甚至会导致程序直接挂掉;
【关于部分Android手机厂商默认关闭系统UDP问题解决方案】Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
PS:每一次开发过程中,不论向系统申请了什么类型的资源或对象,使用结束后,都应该主动释放掉,否则很容易造成内存的不断泄漏,直至内存溢出,导致程序挂掉;
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- android第三方框架(五)ButterKnife
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- Android中的AES加密-下
- 醒不来的梦
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- 关于自我为中心的一点感想
- 生命中最迷人的部分轻拿轻放