Android 9 - сокет Connect TIMEOUT, когда мобильные данные включены - PullRequest
2 голосов
/ 09 мая 2019

У меня развернуто приложение, которое не работает на Android 9. Часть его функции - настроить модуль в сети точки доступа, чтобы этот модуль мог подключаться к домашней сети пользователя.

У меня есть код, который обнаруживает и подключается к правильной сети WIFI, но когда я пытаюсь открыть сокет для устройства, он не работает - только на Android 9 и только если мобильные данные включены. Если я вручную отключаю мобильные данные на устройстве, все работает нормально.

Socket open() {
    Socket sock = new Socket(Proxy.NO_PROXY);
    try {
        sock.bind(new InetSocketAddress(localIpAddress(), 50000));
    } catch (IOException e) {
        activity.logContent("Warning: Failed to bind socket : " + e.toString());
    }
    try {
        sock.connect(new InetSocketAddress("192.168.17.1", 5555), (int)5000);
    } catch (IOException e) {
        // This catch fires when Mobile Data is on.
        activity.logContent("Connected to " + activity.mWifiManager.getConnectionInfo().getSSID());
        activity.logContent("Couldn't open socket : " + e.toString());
    }
    return sock;
}

Я пробовал это с и без Proxy.NO_PROXY и с и без вызова bind(). Если вызов связывания отсутствует, ошибка означает, что сокет пытается подключиться через сотовую сеть. (Примечание: activity.logContent() - это экранный журнал, поэтому легче видеть, что происходит, если он не подключен к отладчику).

Есть идеи, что не так?

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Я не уверен в точной причине, почему это происходит.Однако, когда вы включаете свои мобильные данные и подключены к Интернету только с помощью мобильных данных (учитывая, что ваш Wi-Fi выключен), он получает IP-адрес от сотовой сети, которая больше не подключена к вашей домашней сети.Следовательно, ожидать таких сценариев тайм-аута тривиально, потому что он не может достичь частных IP-адресов вашей домашней сети, начиная с 192.168.....

Теперь я путаюсь с тем, что даже если мобильные данные включены, и одновременно включены и Wi-Fi, и мобильные данные, устройство должно подключаться к Wi-Fi в качестве поведения по умолчанию.

Поэтому я хотел бы предложить вам проверить следующее.

  • Android 9 (Pie) вводит специальную настройку Wifi , которая предотвращает автоматическое подключение к публичным сетям.Вы можете рассмотреть возможность проверки настроек.
  • Пожалуйста, проверьте IP-адрес вашего устройства и проверьте, есть ли у него какой-либо IP-адрес, начинающийся с 192.168.....Если нет, то, безусловно, вы получаете свой IP-адрес из своей сотовой сети и, следовательно, он не может достичь ваших личных IP-адресов домашней сети.
0 голосов
/ 10 мая 2019

В Android 9 есть конфигурация безопасности о сети: Конфигурация безопасности Android

Добавление вашего домена в network_security_config может решить вашу проблему.У меня было это в моем network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">119.xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>
...