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

3 回答 3

8

我只是偶然发现了这个问题——对于 OP 来说可能已经晚了几年,但以防万一它对其他人有帮助,你可能需要使用WIFI_MODE_FULL_HIGH_PERF而不是WIFI_MODE_FULL,因为这可能会导致流问题:

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

我可能会考虑以 aService而不是a 来传输音频Activity,尤其是当您似乎在设计它时考虑到在后台运行的想法。

于 2015-07-17T14:54:47.013 回答
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();
            }
        }

我认为在您的情况下缺少的是您没有获得锁。请参阅此链接

于 2018-11-06T07:16:03.583 回答
0

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

于 2013-07-06T12:25:27.923 回答