ServerSocket в Android не принимает в спящем режиме [экран выключен]

Мне нужно принимать данные с помощью ServerSocket, который находится в потоке фоновой службы. ServerSocket нормально принимает данные, когда устройство [Galaxy s3 19300, Android 4.1.2] находится в состоянии WAKE. Но ServerSocket, похоже, не принимает, когда устройство находится в режиме SLEEP, то есть когда экран выключен.

Я пытался использовать блокировки WIFI, полные и частичные, а также блокировки POWER, но оба варианта не могли заставить ServerSocket слушать.

Есть какие-нибудь подсказки, чтобы решить эту проблему, ребята?

Код

// -------------------------------------------------------------------------
private void CallSock() {
    Log.i("$$$$$",
        "Before WiFI State is " + Integer.toString(wm.getWifiState()));
    wm = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
    wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL, "MyWifiLock");
    PowerManager mgr = (PowerManager) mContext
            .getSystemService(Context.POWER_SERVICE);
    WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyWakeLock");
    wakeLock.acquire();
    if (!wifiLock.isHeld()) {
        wifiLock.acquire();
        Log.i("$$$$$", "Wifi lock acquired");
    }
    Looper.prepare();
    sSocket = new ServerSocket(serverPort);
    while (true) {
        Log.i("$$$$$", "In the While loop WiFI State is "
                + Integer.toString(wm.getWifiState()));
        Rulecontent.writeLogInfo("Waiting to recieve file");
        String fileName = readFile();
    }
}

// -------------------------------------------------------------
public String readFile() {
    StringBuilder x = null;
    try {
        InputStream in = null;
        Socket recvClientSocket = sSocket.accept();
        in = recvClientSocket.getInputStream();
        byte[] bytes = new byte[1024];
        x = new StringBuilder();
        int numRead = 0;
        while ((numRead = in.read(bytes)) >= 0) {
            x.append(new String(bytes, 0, numRead));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return x.toString();
}
// -------------------------------------------------------------------------

person osum    schedule 30.07.2013    source источник
comment
Вам нужно опубликовать свой сервисный код - проблема, вероятно, в том, что телефон уже спит, поэтому вы никогда не получите блокировки   -  person Mr_and_Mrs_D    schedule 31.07.2013


Ответы (1)


Убедитесь, что у вас есть разрешение android.permission.WAKE_LOCK, а пользователь установил для своих настроек Wi-Fi значение «Никогда не спать» в Android Wifi Manager.

Я убедился, что ServerSocket работает с выключенным экраном в Android 4.0 в стандартном потоке (запускается действием) — я не пробовал его в качестве фоновой службы. Я могу отправлять команды на свой телефон каждые 10 минут с внешнего сервера.

Фрагмент кода для получения замков Wi-Fi и питания, которые требуются оба:

https://stackoverflow.com/a/18916511/830775

person Adam Albright    schedule 20.09.2013