Я пытаюсь создать службу android, которая будет выполнять вызовы REST с использованием OkHttp. Последовательность вызовов следующая:
- Приложение вызывает startService (Intent) для запуска службы, передавая соответствующую информацию в Intent
- Служба расширяет IntentService и обрабатывает один Intent в время
- Служба пытается вызвать веб-службу, но она немедленно завершается с ошибкой с помощью
ConnectException - Network is unreachable
Если я изменяю код, чтобы пропустить службу, и приложение просто вызывает веб-служба напрямую из потока, вызов успешно завершен.
Дополнительные сведения:
- Устройство android подключено к ноутбуку через adb (2 разъема USB с сетевым кабелем)
- Мой ноутбук работает Android Studio для отладки приложения / службы
- Мой ноутбук также поддерживает веб-службы
- URL-адрес веб-службы, используемый устройством android это IP-адрес подключения ADB к моему ноутбуку. Следовательно, это выглядит примерно так: http://10.10.10.101: 8080 / api / v1 / doStuff
- На этом устройстве пока нет Wi-Fi или сотовой связи. Только adb соединение.
- Устройство android может пропинговать мой ноутбук, используя этот IP-адрес
- targetSdkVersion 28
- 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 будет работать, когда приложение вызывает его, но не когда служба вызывает ее?
ОБНОВЛЕНИЕ: Если служба запущена в том же процессе, что и приложение, вызов веб-службы будет успешным. Если служба работает в своем собственном процессе (как я определил выше), вызов не выполняется. Это кому-нибудь подсказка?