Nous avons une WebView dans notre application Android qui permet aux utilisateurs finaux de naviguer sur le site de leur choix. Android Pie désactivé HTTP standard par défaut, nous avons donc ajouté usesClearTextTraffic = "fidèle" à notre manifeste.
Cela fonctionne pour certains sites, mais pas pour d'autres, comme google.com! Sur les sites qui ne fonctionnent pas, nous obtenons toujours net :: ERR_CLEARTEXT_NOT_PERMITTED comme si nous n'avions pas défini le paramètre de manifeste.
Je pensais que cela pourrait être lié à HSTS, mais dans ce cas, je m'attendrais à ce que WebView redirige immédiatement vers HTTPS.
La question est donc de savoir pourquoi Android WebView ne peut toujours pas parcourir certains sites par HTTP simple, même lorsque usesClearTextTraffic est activé dans le manifeste?
(PS Nous n'avons pas de configuration de sécurité réseau)
Nous testons sur Google Pixel 1XL.
http simple ne fonctionne pas:
fonctionnement simple de http:
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.umajin.umajinviewer">
<permission Android:name="com.umajin.umajinviewer.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
<uses-permission Android:name="com.umajin.umajinviewer.permission.C2D_MESSAGE" />
<application Android:label="Umajin Preview"
Android:icon="@mipmap/ic_launcher"
Android:theme="@Android:style/Theme.NoTitleBar">
<activity Android:name="Umajin"
Android:label="Umajin Preview"
Android:configChanges="orientation|screenSize|keyboardHidden"
Android:screenOrientation="fullSensor"
Android:icon="@mipmap/ic_launcher"
Android:largeHeap="true"
Android:windowSoftInputMode="stateHidden|adjustPan"
Android:launchMode="singleTask"
Android:usesCleartextTraffic="true"
>
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action Android:name="Android.nfc.action.TAG_DISCOVERED"/>
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action Android:name="Android.nfc.action.NDEF_DISCOVERED" />
<category Android:name="Android.intent.category.DEFAULT" />
<data Android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action Android:name="Android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action Android:name="Android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
</activity>
<receiver
Android:name=".GcmBroadcastReceiver"
Android:permission="com.google.Android.c2dm.permission.SEND" >
<intent-filter
Android:priority="1">
<action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
<category Android:name="com.umajin.umajinviewer" />
</intent-filter>
</receiver>
<service Android:name=".MyIntentService" />
<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />
<meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="<redacted>"/>
<!-- Specify which class to instantiate for the alarm messages -->
<receiver Android:name="com.umajin.app.AlarmReceiver" >
</receiver>
<!-- Use this receiver if you to excute something at boot -->
<!-- Required if you want alarms to survive a device restart -->
<receiver
Android:name="com.umajin.umajinviewer.BootReceiver"
Android:enabled="true"
Android:exported="true"
Android:label="BootReceiver">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- end boot receiver -->
<!-- Add this to play private video files in fullscreen externally through intents. -->
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="com.umajin.umajinviewer.files"
Android:grantUriPermissions="true"
Android:exported="false">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/filepaths" />
</provider>
<!-- Android Pie specific fix for crash on Google Maps. Throws a ClassNotFoundException when it fails to
find "org.Apache.http.ProtocolVersion".
See https://stackoverflow.com/questions/50782806/Android-google-maps-Java-lang-noclassdeffounderror-failed-resolution-of-lorg-a -->
<uses-library Android:name="org.Apache.http.legacy" Android:required="false"/>
</application>
<uses-feature Android:glEsVersion="0x00020000" />
<uses-feature Android:name="Android.hardware.camera" Android:required="false" />
<uses-feature Android:name="Android.hardware.camera.autofocus" Android:required="false" />
<uses-feature Android:name="Android.hardware.location" Android:required="false" />
<uses-feature Android:name="Android.hardware.location.gps" Android:required="false" />
<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<supports-screens Android:largeScreens="true" Android:normalScreens="true" Android:anyDensity="true" Android:smallScreens="true"/>
<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.CALL_PHONE"/>
<uses-permission Android:name="Android.permission.SEND_SMS"/>
<!-- WRITE no longer implies READ. By agreement, we always ask
for both at a time as the user prompts are identical and it can appear to
a user that they have been asked for the same thing twice even though the
underlying permission asked for may be different. -->
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>
<!-- FINE and COARSE permissions result in the same Prompt being displayed to the
user. It can appear to the user that they have been asked for the same thing
twice. By agreement, we always ask for both in one request
to the user to avoid confusing the user. -->
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<uses-permission Android:name="Android.permission.NFC" />
<!-- Used for Samsung fingerprint scanner. -->
<uses-permission Android:name= "com.samsung.Android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>
<!-- Required for Bluetooth LE -->
<uses-feature Android:name="Android.hardware.bluetooth_le" Android:required="false" />
<uses-permission Android:name="Android.permission.BLUETOOTH"/>
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN"/>
<!-- Use this permission if you want your applications to launch on startup -->
<!-- Required if you want alarms to survive a device restart -->
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- Required for WIFI scanning -->
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
<uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
</manifest>
Solution:
Comme je l'ai observé le Manifest.xml
à vous, vous avez utilisé le Android:usesCleartextTraffic="true"
dans le <activity>
tag.
Comme vous pouvez le voir dans la Documentation de la balise d'activité , il n'offre aucune fonctionnalité en tant que telle dans la syntaxe fournie dans la documentation.
Comme vous pouvez le voir dans la capture d'écran ci-dessous, la description du cleartexttraffic est assez simple.
De plus, si vous regardez Documentation de la balise d'application , vous remarquerez que Android:usesCleartextTraffic
est l'un des attributs de Application Tag
.
Donc, le seul correctif requis ici est de supprimer l'attribut in de la balise d'activité et de l'utiliser dans l'application et aucune balise d'activité n'est prise en charge pour Android:usesCleartextTraffic
.
À partir de Android 9 (Pie) Clear Traffic Traffic est désactivé par défaut.
Par conséquent, la solution serait:
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission Android:name="Android.permission.INTERNET" />
<application
...
Android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
Essayez-le, veuillez commenter si vous avez des problèmes liés à cela.