Dans Android 9 (niveau d'API 28) et versions ultérieures, le trafic en clair (HTTP) est désactivé par défaut pour des raisons de sécurité. Cela peut provoquer l'erreur ERR_CLEARTEXT_NOT_PERMITTED lorsqu'une WebView tente de charger une URL HTTP. L'erreur ERR_UNKNOWN_URL_SCHEME peut également apparaître si le schéma d'URL n'est pas pris en charge ou mal géré.
Pour résoudre ces problèmes, plusieurs approches sont possibles. La recommandation principale est d'utiliser des requêtes HTTPS, qui chiffrent le trafic et évitent les erreurs liées au texte en clair. Si cela n'est pas réalisable, des ajustements de configuration peuvent être effectués.
Solution 1 : Adopter HTTPS
Remplacez toutes les URLs HTTP par des URLs HTTPS dans votre application. Par exemple, utilisez "https://exemple.com" au lieu de "http://exemple.com". Cette méthode assure une communication sécurisée et élimine l'erreur ERR_CLEARTEXT_NOT_PERMITTED.
Solution 2 : Configurer la sécurité réseau
Créez un fichier de configuration réseau pour autoriser le trafic en clair si nécessaire. Ce fichier doit être placé dans res/xml/ sous le nom security_config.xml.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Ensuite, référencez cette configuration dans votre fichier AndroidManifest.xml en ajoutant l'attribut aproprié à la balise <application> :
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/security_config"
...>
...
</application>
</manifest>
Solution 3 : Activer le trafic en clair via le manifeste
Une alternative directe consiste à définir l'attribut android:usesCleartextTraffic à true dans la balise <application> du fichier AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
Solution 4 : Ajuster la version du sandbox cible
Si votre application utilise l'attribut android:targetSandboxVersion, assurez-vous qu'il est défini à 1 (valeur par défaut) pour éviter des restrictions supplémentaires :
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
Une valeur de 2 pour cet attribut impose des règles plus strictes, notamment en désactivant le trafic en clair par défaut.
Lorsque vous utilisez une configuration réseau spécifique avec android:networkSecurityConfig, vous pouvez cmobiner des paramètres pour contrôler le trafic en clair au niveau des domaines ou globalement. Par exemple :
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">serveur.exemple.com</domain>
</domain-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
Cela autorise le trafic en clair uniquement pour le domaine spécifié tout en le désactivant par défaut pour les autres.