wifiLock 和 wakeLock 在 Android 上无法正常工作
Posted
技术标签:
【中文标题】wifiLock 和 wakeLock 在 Android 上无法正常工作【英文标题】:wifiLock and wakeLock not working correctly on Android 【发布时间】:2013-02-01 10:21:18 【问题描述】:我正在开发一个需要同时使用 wifiLock 和 wakeLock 的应用程序,这样屏幕关闭时的音频流就不会受到干扰。 我已经在android 2.3和wakeLock上尝试了我的应用程序,看起来wifiLock按预期工作,所以屏幕打开或关闭时没有区别,但屏幕关闭时Android 4.2(Jelly-bean)上的相同应用程序不是工作正常,音频变得断断续续,这表明 wakeLock 或 wifiLock 工作不正常。这有什么原因吗?
这是我在主要活动中获取和释放锁的方式:
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MyWirelessHeadphone");
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL , "MyWifiLock");
...
@Override
protected void onDestroy()
super.onDestroy();
if (wakeLock.isHeld()==true)
wakeLock.release();
if (wifiLock.isHeld()==true)
wifiLock.release();
【问题讨论】:
【参考方案1】:我只是偶然发现了这个问题 - 对于 OP 来说可能已经晚了几年,但为了以防它帮助其他人,您可能需要使用 WIFI_MODE_FULL_HIGH_PERF
而不是 WIFI_MODE_FULL
,因为这可能会导致流式传输问题:
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF , "MyWifiLock");
我可能会考虑在 Service
而不是 Activity
中流式传输音频,尤其是当您似乎在设计它时考虑了在后台运行的想法。
【讨论】:
WIFI_MODE_FULL_HIGH_PERF 是正确答案,它允许接受新的 TCP 传入连接【参考方案2】:发布答案为时已晚,但也许对某人有所帮助。因为我遇到了同样的问题并得到了解决方案:
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF , "MyWifiLock");
wifiLock.acquire();
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
并在destroy方法中释放锁:
if (wakeLock != null)
if (wakeLock.isHeld())
wakeLock.release();
if (wifiLock != null)
if (wifiLock.isHeld())
wifiLock.release();
我认为在您的情况下缺少的是您没有获得锁。看到这个link。
【讨论】:
【参考方案3】:您正在获取活动中的锁定,当您的活动进入堆栈时,系统可以删除并销毁您的活动,这可能是您问题的原因。尝试获取服务中的锁。但是 PARTIAL 锁定和 WIFI 的组合在某些设备上也无法正常工作,请参阅此问题:Android WifiLock not working?
【讨论】:
以上是关于wifiLock 和 wakeLock 在 Android 上无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Android 如何获取当前状态下所有持有wakelock的进程
<转>Flutter使用 Wakelock 插件控制屏幕常亮方法