web-dev-qa-db-fra.com

Comment utiliser Apache http sur Android P

Lorsque j'exécute mon application sur Android P appareils, j'obtiens une erreur comme celle-ci:

Java.lang.RuntimeException: Unable to instantiate application com.le.Android.client.LeApplication: Java.lang.ClassNotFoundException: Didn't find class "com.le.Android.client.LeApplication" on path: DexPathList[[Zip file "/system/framework/org.Apache.http.legacy.boot.jar", Zip file "/data/app/com.le.Android.client-uvQkO641-__8Z_p2oT0t7g==/base.apk"],nativeLibraryDirectories=[/data/app/com.le.Android.client-uvQkO641-__8Z_p2oT0t7g==/lib/arm, /data/app/com.le.Android.client-uvQkO641-__8Z_p2oT0t7g==/base.apk!/lib/armeabi, /system/lib, /vendor/lib]]
at Android.app.LoadedApk.makeApplication(LoadedApk.Java:1009)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:5836)
at Android.app.ActivityThread.access$1000(ActivityThread.Java:198)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1637)
at Android.os.Handler.dispatchMessage(Handler.Java:106)
at Android.os.Looper.loop(Looper.Java:164)
at Android.app.ActivityThread.main(ActivityThread.Java:6649)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:493)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:826)

Caused by: Java.lang.ClassNotFoundException: Didn't find class "com.le.Android.client.LeApplication" on path: DexPathList[[Zip file "/system/framework/org.Apache.http.legacy.boot.jar", Zip file "/data/app/com.le.Android.client-uvQkO641-__8Z_p2oT0t7g==/base.apk"],nativeLibraryDirectories=[/data/app/com.le.Android.client-uvQkO641-__8Z_p2oT0t7g==/lib/arm, /data/app/com.le.Android.client-uvQkO641-__8Z_p2oT0t7g==/base.apk!/lib/armeabi, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:125)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:379)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:312)
at Android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.Java:50)
at Android.app.Instrumentation.newApplication(Instrumentation.Java:1120)
at Android.app.LoadedApk.makeApplication(LoadedApk.Java:1001)
... 9 more

Comment dois-je utiliser la bibliothèque org.Apache.http.legacy dans Android P?

8
Scott

J'ai lu le changements de comportement d'Android P , et je reçois des messages:

Obsolescence du client Apache HTTP Avec Android 6.0, nous avons supprimé la prise en charge du client Apache HTTP. À partir de Android P, cette bibliothèque est supprimée du bootclasspath et n'est pas disponible par défaut pour les applications.

Pour continuer à utiliser le client HTTP Apache, les applications qui ciblent Android P et au-dessus doivent ajouter ce qui suit à leur AndroidManifest.xml:

<uses-library Android: name = "org.Apache.http.legacy" Android: required = "false" />

Remarque: l'attribut Android: required = "false" est requis pour les applications qui ont un SDK minimum de 23 ou moins, car sur les appareils avec des niveaux d'API inférieurs à 24, la bibliothèque org.Apache.http.legacy n'est pas disponible. (Sur ces appareils, les classes Apache HTTP sont disponibles sur le bootclasspath.)

15
Scott

Pour exécuter parfaitement org.Apache.http.legacy dans Android 9.0 Pie, créez un fichier xml res/xml/network_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>

Et ajoutez 2 balises tag dans votre AndroidManifest.xml

Android: networkSecurityConfig = "@ xml/network_security_config"

Android: nom = "org.Apache.http.legacy"

<?xml version="1.0" encoding="utf-8"?>
 <manifest......>
  <application Android:networkSecurityConfig="@xml/network_security_config">
   <activity..../> 
   ......
   ......
 <uses-library
        Android:name="org.Apache.http.legacy"
        Android:required="false"/>
</application>

Ajoutez également useLibrary 'org.Apache.http.legacy' dans votre gradle de construction d'application

Android {
compileSdkVersion 28
defaultConfig {
    applicationId "your application id"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    useLibrary 'org.Apache.http.legacy'
}
4
Gitesh