web-dev-qa-db-ja.com

Android MarshmallowでレガシーApache HTTPクライアントを使用する方法は?

バックグラウンド

Android Marshmallowでは、GoogleはApache HTTPクライアントのサポートを完全に削除しました(リンク here )他の選択肢に比べてパフォーマンスが良くありません。

これは、Android Marshmallowで非常に多くのアプリがクラッシュする原因にもなります。

問題

Googleでは、gradleファイルに次の行を追加することにより、組み込みのAPIとしてではなく、このAPIを引き続き使用できます。

useLibrary 'org.Apache.http.legacy'

だから、これは私がやったことです:

dependencies {
    classpath 'com.Android.tools.build:gradle:1.3.0'
}

そして:

Android {
    compileSdkVersion 'Android-MNC'
    buildToolsVersion "23.0.0 rc3"
    useLibrary 'org.Apache.http.legacy'

    defaultConfig {
        applicationId "com.example.user.androidmtest"
        minSdkVersion 'MNC'
        targetSdkVersion 'MNC'
        versionCode 1
        versionName "1.0"
    }

私がそれを試してみたところ、うまくコンパイルされました(エラーは表示されず、特別なコードがないので概念実証アプリを実行できました)が、私が知っているいくつかのクラスを使ってみました(「HttpClient」クラスのような)古いAPIの一部であるため、そうすることはできません。

このソリューションを使用することはお勧めしませんが、Android Marshmallowで変更されるすべてのことを100%実行するまで、少なくとも一時的にそこで動作するようにアプリを準備する必要があります。クラッシュの形で驚きを望んでいません。

スクリーンショットは次のとおりです。

enter image description here

質問

なぜ発生するのですか?正しく使いましたか?


編集:ここでこの問題について報告しました:

https://code.google.com/p/Android/issues/detail?id=181474

72

Android Studioは、org.Apache.httpクラスが

org.Apache.http.NameValuePair
org.Apache.http.client.utils.URLEncodedUtils

行方不明でした。

そこで、org.Apache.http.legacy.jarフォルダーにあるAndroid/Sdk/platforms/Android-23/optionalapp/libsに追加しました

また、この行をapp.gradleファイルに追加しました

compile files('libs/org.Apache.http.legacy.jar')

しかし、より多くのライブラリを使用している場合は、この方法を使用できます

compile fileTree(dir: 'libs', include: ['*.jar'])

これにより、GoogleがApache HTTPクライアントのサポートを削除したために発生したすべてのエラーが解決しました。

92
CoPLaS

useLibrary 'org.Apache.http.legacy'は、次のようにAndroid St​​udioプロジェクトのメインbuild.gradleファイルのGradleツールバージョンをアップグレードするまで機能しませんでした。

dependencies {
    classpath 'com.Android.tools.build:gradle:1.3.0'
}
9
Jamie Hall

ここでは、単純なファイルパスチェックを実行することで完璧なソリューションを提供します。実行することにより

   Android {
    compileSdkVersion 'Android-MNC'
    buildToolsVersion "23.0.0 rc3"
    useLibrary 'org.Apache.http.legacy'

    defaultConfig {
        applicationId "com.example.user.androidmtest"
        minSdkVersion 'MNC'
        targetSdkVersion 'MNC'
        versionCode 1
        versionName "1.0"

    }

        getBootClasspath().each{File file ->
           println file.absolutePath
        }
    }
}

以下のようなものが得られます

/Users/"yourname"/Development/Android-sdk-macosx/platforms/Android-MNC/Android.jar /Users/"yourname"/Development/Android-sdk-macosx/platforms/Android-MNC/optional/org.Apache .http.legacy.jar

Jarがありますが、何らかの理由でプロジェクトに追加されませんでした。しかし、いつでも手動で追加できます。

8
WenChao

多くのイライラする時間の後、次のように機能しました:

1。 Apache jarを見つけます。次のような場所に配置する必要があります。

C:\Users\<yourname>\AppData\Local\Android\sdk\platforms\Android-23\optional

2。 libsフォルダーにorg.Apache.http.legacy.jarをコピーします。

Libs-> pasteを右クリックするか、ファイルエクスプローラーを使用してプロジェクトのlibsフォルダーに移動し、貼り付けます。

Libsフォルダーがない場合は、私が行ったように、新しいプロジェクトを作成し、関連するすべてのファイルをそれぞれの場所にインポートします。

3。 okをクリックします こちらを参照

4。最も重要なステップ:Apacheフォルダーを右クリックし、Add As Libraryを選択します。こちらを参照

これが誰かが自分たちの生活を続けるのに役立つことを願っています。

6
The AEB

私はこれが愚かな理由であることを知っていますが、リストで試してみてください...

最近この問題が発生しましたが、これはパスの長さの制限が原因で、最大256文字だと思います。

プロジェクトを再配置すると、ビルドが成功します。この作業を期待してください。

2
Arpit Patel

上記の答えは、デバッグビルドを実行し、gradleを使用しているビルドをリリースするのに役立ちます。

レガシーApacheクラスを使用するすべてのプロジェクトインスタンスで、マニフェストファイルのアプリケーションタグ内にこれを挿入します。

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

これは、コンパイル中にまだEclipseおよびantスクリプトを使用しているユーザーに役立ちます。

2
Pier Betos

にあるレガシーApacheライブラリ

[Android_SDK]\platforms\Android-23\optional\org.Apache.http.legacy.jar 

したがって、プロジェクト内にコピーすることができますlibsまたは単に使用する

compile files("${Android.getSdkDirectory().getAbsolutePath()}" + File.separator + "platforms" + File.separator + "Android-23" + File.separator + "optional" + File.separator + "org.Apache.http.legacy.jar")

あなたの/ app/build.gradle

2
AndreyICE

まず、libsフォルダーでそれを確認する必要があります

Make sure in Libs Folder Check that Apache library

Then add into your gradle file like this 

    Android {
        compileSdkVersion 23
        buildToolsVersion '23.0.2'

        defaultConfig {
            applicationId "info.tranetech.laundry"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            }
        }
    }
    Android {
        useLibrary 'org.Apache.http.legacy'
    }
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.Android.support:appcompat-v7:23.0.1
        compile 'com.Android.support:design:23.0.1
        testCompile 'junit:junit:4.12'
        compile files('libs/Android-async-http-1.4.4.jar')
        compile 'com.google.Android.gms:play-services:8.4.0'
    }

This Is my gradle file

Also check external library

2
Arpit Patel

Sdk/platforms/Android-23/optional/optional.jsonでこれを有効にします

[
  {
    "name": "org.Apache.http.legacy",
    "jar": "org.Apache.http.legacy.jar",
    "manifest": false
  }
]
1
arun-r

削除する

useLibrary 'org.Apache.http.legacy' 

build.gradleから、この行をapp.gradleファイルにも追加しました

compile files('libs/org.Apache.http.legacy.jar')

しかし、より多くのライブラリを使用している場合は、この方法を使用できます

compile fileTree(dir: 'libs', include: ['*.jar'])

CoPLaSの回答は私の問題を修正しました。

0
Roger Belk

Android MarshmallowでレガシーApache HTTPクライアントを使用する方法は?

API 23+でApache HTTPクラスを引き続き使用するには:

まず、build.gradle fにgradle dependencieを追加してください

buildscript {

    dependencies {
        classpath 'com.Android.tools.build:gradle:2.0.0'
    }
}

次に、プロジェクトのbuild.gradle内に参照を追加します。

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"
    useLibrary 'org.Apache.http.legacy'
    ...
}
0
Elenasys

この問題を解決する簡単な方法は、C:\ Users\username\AppData\Local\Android\sdk\platformsです。ここでAndroid-23を削除し、SDKマネージャーからAPI 23を再度更新します。それはあなたの問題を解決します。

0
impathuri