wifiLock и wakeLock не работают корректно на Android

Я разрабатываю приложение, которое должно использовать как 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();
}   

person TJ1    schedule 16.02.2013    source источник


Ответы (3)


Я только что наткнулся на этот вопрос - возможно, на пару лет слишком поздно для ОП, но на всякий случай, если это поможет кому-то еще, вам, вероятно, нужно использовать WIFI_MODE_FULL_HIGH_PERF вместо WIFI_MODE_FULL, так как это может вызвать проблемы с потоковой передачей:

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

Я бы, вероятно, посмотрел на потоковую передачу звука в Service вместо Activity, тем более что вы, похоже, разрабатываете его с идеей запуска в фоновом режиме.

person HexAndBugs    schedule 17.07.2015
comment
WIFI_MODE_FULL_HIGH_PERF — правильный ответ, он позволяет принимать новые входящие TCP-соединения. - person Poppyto; 17.11.2017

Уже так поздно публиковать ответ, но, возможно, это кому-то поможет. Поскольку я столкнулся с той же проблемой и получил решение:

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

Что, я думаю, отсутствует в вашем случае, так это то, что вы не получаете замки. См. эту ссылку.

person user434    schedule 06.11.2018

Вы получаете блокировку активности, и когда ваша активность попадает в стек, система может удалить и уничтожить вашу активность, и это может быть причиной вашей проблемы. Попробуйте получить блокировку в сервисе. Но комбинация ЧАСТИЧНОЙ блокировки и WIFI не работает должным образом на некоторых устройствах, см. этот вопрос: Android WifiLock не работает?

person gst    schedule 06.07.2013