Вызов okHttp работает из приложения, но не в том случае, если он сделан в сервисе. Сбой ConnectException: сеть недоступна - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать службу android, которая будет выполнять вызовы REST с использованием OkHttp. Последовательность вызовов следующая:

  1. Приложение вызывает startService (Intent) для запуска службы, передавая соответствующую информацию в Intent
  2. Служба расширяет IntentService и обрабатывает один Intent в время
  3. Служба пытается вызвать веб-службу, но она немедленно завершается с ошибкой с помощью ConnectException - Network is unreachable

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

Дополнительные сведения:

  1. Устройство android подключено к ноутбуку через adb (2 разъема USB с сетевым кабелем)
  2. Мой ноутбук работает Android Studio для отладки приложения / службы
  3. Мой ноутбук также поддерживает веб-службы
  4. URL-адрес веб-службы, используемый устройством android это IP-адрес подключения ADB к моему ноутбуку. Следовательно, это выглядит примерно так: http://10.10.10.101: 8080 / api / v1 / doStuff
  5. На этом устройстве пока нет Wi-Fi или сотовой связи. Только adb соединение.
  6. Устройство android может пропинговать мой ноутбук, используя этот IP-адрес
  7. targetSdkVersion 28
  8. OkHttp версия 4.3.1

Служба определяется в манифесте следующим образом (обратите внимание, как служба запускается в другом процессе):

        <service
            android:name=".webapi.WebAPIService"
            android:exported="false"
            android:process=":webapi">
        </service>

Манифест включает следующие разрешения, которые служба должна наследовать, я считаю:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.SET_TIME"/>
    <uses-permission android:name="android.permission.SHUTDOWN"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Я вижу два предупреждения, которые, по моему мнению, являются доброкачественными после некоторого поиска в Google:

W/ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.startService:1357
Rejecting re-init on previously-failed class java.lang.Class<okhttp3.internal.platform.ConscryptPlatform$configureTrustManager$1>: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/conscrypt/ConscryptHostnameVerifier;

Любые идеи, почему тот же код OkHttp будет работать, когда приложение вызывает его, но не когда служба вызывает ее?

ОБНОВЛЕНИЕ: Если служба запущена в том же процессе, что и приложение, вызов веб-службы будет успешным. Если служба работает в своем собственном процессе (как я определил выше), вызов не выполняется. Это кому-нибудь подсказка?

...