Android上的wifi锁和唤醒锁不能正确工作

6
我正在开发一款应用程序,需要同时使用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();
}   
3个回答

8

我才刚看到这个问题,可能已经晚了几年回答它,但以防能帮助其他人,你可能需要使用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传入连接。 - Poppyto

6

虽然回答已经晚了,但或许能帮到一些人。因为我也遇到了同样的问题,并找到了解决方案:

        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();
            }
        }

我认为你的问题是没有获取锁。请参考此链接了解更多信息。

0
你正在一个活动中获取锁,当你的活动进入堆栈时,系统可能会移除并销毁你的活动,这可能是你问题的原因。尝试在服务中获取锁。但部分锁和 WIFI 的组合在某些设备上也无法正常工作,请参考此问题:Android WifiLock not working?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接