Android 8: Le trafic HTTP en clair n'est pas autorisé


J'ai eu des rapports d'utilisateurs avec Android 8 que mon application (qui utilise le flux principal) n'affiche pas de contenu. Après enquête, j'ai trouvé l'exception suivante sur Android 8:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(j'ai supprimé le nom du paquet, l'URL et d'autres identifiants possibles)

Sur Android 7 et inférieur tout fonctionne, je ne mets pas android:usesCleartextTraffic dans le manifeste (et le définir sur true n'aide pas, c'est la valeur par défaut de toute façon), je n'utilise pas non plus les informations de sécurité réseau. Si j'appelle NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), il renvoie false pour Android 8, true pour l'ancienne version, en utilisant le même fichier apk. J'ai essayé de trouver une mention de cela sur Google info sur Android O, mais sans succès.

Author: david.s, 2017-08-29

7 answers

Selon Configuration de sécurité réseau -

À partir d'Android 9.0 (niveau API 28), la prise en charge du texte clair est désactivé par défaut.

Jetez également un oeil à - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Option 1 -

Créer le fichier res/xml/network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</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 2 -

AndroidManifest.XML -

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

Aussi comme @david.s' réponse souligné android:targetSandboxVersion peut être un problème de trop -

Selon Documents manifestes -

android:targetSandboxVersion

Le bac à sable cible pour cette application à utiliser. Plus la version sandbox est élevée nombre, plus le niveau de sécurité est élevé. Sa valeur par défaut est 1; vous peut également le régler sur 2. Définir cet attribut sur 2 permet de basculer l'application sur un bac à sable SELinux différent. Les restrictions suivantes s'appliquent à un niveau 2 bac à sable:

  • La valeur par défaut de usesCleartextTraffic dans la configuration de sécurité réseau est false.
  • Le partage d'Uid n'est pas autorisé.

Donc Option 3 -

Si vous avez android:targetSandboxVersion dans <manifest>, puis réduire à 1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
 128
Author: Hrishikesh Kadam, 2018-08-11 13:43:58

Dans l'AndroidManifest, j'ai trouvé ce paramètre:

    android:networkSecurityConfig="@xml/network_security_config"

Et @xml/network_security_config est défini dans network_security_config.xml comme:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

J'ai juste changé cleartextTrafficPermitted en true

 10
Author: byOnti, 2018-03-21 04:10:17

Cela pourrait être utile pour quelqu'un.

Nous avons récemment eu le même problème pour Android 9, mais nous avions seulement besoin d'afficher certaines URL dans WebView, rien de très spécial. Donc, l'ajout de android:usesCleartextTraffic="true" à Manifest a fonctionné, mais nous ne voulions pas compromettre la sécurité de toute l'application pour cela. Le correctif consistait donc à changer les liens de http à https

 4
Author: etilia, 2018-09-17 15:44:34

D'accord, j'ai compris cela. Cela est dû au paramètre Manifeste android:targetSandboxVersion="2", que j'ai ajouté car nous avons également la version de l'application instantanée - il faut s'assurer qu'une fois l'utilisateur passe de l'application instantanée à l'application régulière, il ne perdra pas ses données avec le transfert. Cependant, comme le suggère la description vague:

Spécifie le bac à sable cible que cette application souhaite utiliser. Les versions sanbox supérieures auront des niveaux de sécurité croissants.

La valeur par défaut de cet attribut est 1.

Il ajoute évidemment également un nouveau niveau de politique de sécurité, au moins sur Android 8.

 3
Author: david.s, 2017-08-30 08:15:24
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

Dans la suggestion fournie ci-dessus, je fournissais mon URL comme http://xyz.abc.com/mno/

J'ai changé cela en xyz.abc.com puis il a commencé à fonctionner.

 1
Author: Lorence, 2018-09-16 13:59:21

J'ai eu le même problème, Et j'ai essayé toutes les solutions ci-dessus mais rien ne fonctionne.

Pour moi, je l'ai résolu en changeant mes URL de HTTP en HTTPS ;

Ça marche!!!

 1
Author: eLi, 2018-10-04 17:12:43

Seul menifest ajoute cette propriété

  <manifest ...>
  <uses-permission android:name="android.permission.INTERNET" />
  <application
    ...
    android:usesCleartextTraffic="true"
    ...>
    ...
  </application>
  </manifest>
 1
Author: Najib Puthawala, 2018-10-11 08:56:41