wifiLock和wakeLock在Android上无法正常工作

时间:2013-02-16 15:06:25

标签: android wifi android-4.2-jelly-bean wakelock

我正在开发一个需要同时使用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 个答案:

答案 0 :(得分:3)

我只是偶然发现了这个问题 - 可能对OP来说已经太晚了几年,但为了防止其他人,你可能需要使用WIFI_MODE_FULL_HIGH_PERF代替WIFI_MODE_FULL,这会导致流媒体问题:

wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF , "MyWifiLock");

我可能会考虑在Service而不是Activity中播放音频,尤其是因为您似乎正在设计它,并且想要在后台运行。

答案 1 :(得分:0)

您正在获取活动中的锁定,当您的活动进入堆栈时,系统可以删除并销毁您的活动,这可能是您的问题的原因。尝试获取服务中的锁定。但PARTIAL锁和WIFI的组合在某些设备上无法正常工作,请看这个问题:Android WifiLock not working?

答案 2 :(得分:0)

发布答案太晚了,但也许对某人有所帮助。当我遇到同样的问题并得到解决方案时:

        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