Приложению Android не удается отправить http-запросы

#java #android #retrofit #httprequest #retrofit2

#java #Android #модернизация #httprequest #retrofit2

Вопрос:

У меня есть приложение для Android, которое использует Retrofit для выполнения http-запросов (POST) и дальнейшей оценки входящих данных. На моем тестовом телефоне (Samsung J5 P) приложение работает абсолютно нормально, оно подключается и отправляет запросы так, как должно. Но при попытке одновременной работы приложения на двух разных телефонах приложение на другом телефоне каким-то образом не отправляет запросы (модифицированный метод OnFailure вызывает метод OnFailure при сбое соединения). Я включил все разрешения, но проблема, похоже, возникает.

Кроме того, я разместил сервер на своем рабочем столе (localhost), и я убедился, что оба моих устройства подключены к одной сети.

Что может быть причиной этой проблемы? Спасибо.

Комментарии:

1. распечатайте объект, который можно выбросить при сбое, и, пожалуйста, сообщите, в чем ошибка..

2. @RishabhRitweek «Передача открытого текста на <мой ip> не разрешена политикой сетевой безопасности»

3. @RishabhRitweek это потому, что я еще не включил SSL-соединение? Требуется ли это?

4. проверьте мой ответ..

Ответ №1:

Начиная с Android 9 (уровень API 28), поддержка открытого текста по умолчанию отключена.

Также взгляните на — https://koz.io/android-m-and-the-war-on-cleartext-traffic /

Объяснение Codelabs — https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

 Option 1 -

First try hitting the URL with "https://" instead of "http://"

Option 2 -

Create file res/xml/network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>
AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>
Option 3 -

android:usesCleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

 android:targetSandboxVersion can be a problem too -

According to Manifest Docs -

android:targetSandboxVersion

The target sandbox for this app to use. The higher the sandbox version number, the higher the level of security. Its default value is 1; you can also set it to 2. Setting this attribute to 2 switches the app to a different SELinux sandbox. The following restrictions apply to a level 2 sandbox:

The default value of usesCleartextTraffic in the Network Security Config is false.
Uid sharing is not permitted.
So Option 4 -

If you have android:targetSandboxVersion in <manifest> then reduce it to 1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
  

Комментарии:

1. спасибо, чувак, вариант 2 сработал для меня. я забыл проверить сообщение об ошибке, последний час я был в стрессе, пытаясь разобраться в проблеме

Ответ №2:

Создайте файл конфигурации сети в каталоге res / xml

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

а затем добавьте android:networkSecurityConfig="@xml/network_security_config" в тег приложения вашего манифеста

Комментарии:

1. Спасибо! я забыл проверить сообщение об ошибке, я ломал голову, выясняя, в чем проблема. еще раз спасибо.