web-dev-qa-db-ja.com

Android PでApache httpを使用する方法

Android Pデバイスでアプリを実行すると、次のようなエラーが表示されます。

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

ライブラリをどのように使用すればよいですかorg.Apache.http.legacy in Android P

8
Scott

Android Pの動作の変更 を読み、いくつかのメッセージを受け取ります。

Apache HTTPクライアントの非推奨Android 6.0では、Apache HTTPクライアントのサポートを削除しました。Android Pで始まると、そのライブラリはbootclasspathから削除され、デフォルトでアプリで利用できます。

Apache HTTPクライアントを引き続き使用するには、Android P以上をターゲットとするアプリが、AndroidManifest.xmlに以下を追加する必要があります:

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

注:APIレベルが24未満のデバイスではorg.Apache.http.legacyライブラリを使用できないため、Android:required = "false"属性は、SDKが23以下のアプリに必須です。 (これらのデバイスでは、Apache HTTPクラスがbootclasspathで利用可能です。)

15
Scott

Android 9.0 Pieで完全にorg.Apache.http.legacyを実行するには、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>

そして、AndroidManifest.xmlに2つのタグタグを追加します

Android:networkSecurityConfig = "@ xml/network_security_config"

Android:name = "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>

また、アプリのビルドグラドルにuseLibrary 'org.Apache.http.legacy'を追加します

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