如何在Android Marshmallow上使用传统的Apache HTTP客户端?

背景

在Android Marshmallow中,Google已经完全取消了Apache HTTP客户端的支持(链接在这里 ),因为与其他select相比,Google的客户端性能不佳。

这也可能是导致Android棉花糖崩溃的原因。

问题

谷歌允许你仍然使用这个API,而不是作为一个内置的,通过添加这一行到gradle文件:

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" } 

当我尝试它,它编译好(没有错误被显示,我可以运行的概念validation的应用程序,因为它没有任何特殊的代码),但是当我尝试使用一些我知道的类是旧的API(如“HttpClient”类)的一部分,我看到它不允许我这样做。

我知道不build议使用这个解决scheme,但我们必须让应用程序准备好在那里至less暂时工作,直到我们对Android Marshmallow应该改变的所有事情百分之百地工作,并且我们不希望在崩溃的forms。

这里有一个截图:

在这里输入图像描述

这个问题

为什么会发生? 我是否正确使用它?


编辑:在这里报告关于这个问题:

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

Android Studio抱怨org.apache.http类喜欢

 org.apache.http.NameValuePair org.apache.http.client.utils.URLEncodedUtils 

失踪。

所以我添加了org.apache.http.legacy.jarAndroid/Sdk/platforms/android-23/optional文件夹到app/libs

我也将这一行添加到我的app.gradle文件

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

但是如果你使用更多的库,你可以用这种方式

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

这解决了我所有的错误,因为谷歌删除了Apache HTTP客户端的支持。

useLibrary'org.apache.http.legacy'在我升级我的Android Studio项目的主要build.gradle文件中的Gradle工具版本之前并不适用,如下所示:

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

通过运行简单的文件path检查完美的解决scheme。 通过运行

  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子在那里。由于某种原因,它没有被添加到项目中。 但你总是可以手动添加它我猜。

经过许多令人沮丧的时间,以下工作:

1.findapache jar。 它应该驻留在某个地方:

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

2.将 org.apache.http.legacy.jar 复制 到您的libs文件夹。

右键单击库 – >粘贴,或者使用文件浏览器导航到项目的库文件夹并粘贴。

如果你没有libs文件夹,就像我一样,创build一个新项目并将所有相关文件导入到它们各自的位置。

3.点击ok 看到这个

4.最重要的步骤:右键单击apache文件夹并selectAdd As Library 看到这个

希望这有助于人们继续他们的生活。

我知道这是愚蠢的理由,但在列表中尝试…

我最近遇到这个问题,是由于path长度限制,我认为最多256个字符。

重新定位你的项目,构build将成功。希望为你工作。

传统的Apache库位于

 [ANDROID_SDK]\platforms\android-23\optional\org.apache.http.legacy.jar 

所以你可以复制它在你的项目或只是使用

 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

首先你必须检查你的libs文件夹

确保在Libs文件夹检查Apache库

 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' } 

这是我的gradle文件

另外检查外部库

上面的答案只是帮助debugging构build运行,并释放利用gradle的构build。

在清单文件的应用程序标签内部,在使用传统apache类的所有项目实例中插入:

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

这有助于那些在编译期间仍然使用Eclipse和ant脚本的人。

在sdk / platforms / android-23 / optional / optional.json中启用它

 [ { "name": "org.apache.http.legacy", "jar": "org.apache.http.legacy.jar", "manifest": false } ] 

去掉

 useLibrary 'org.apache.http.legacy' 

从build.gradle,我也将这一行添加到我的app.gradle文件

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

但是如果你使用更多的库,你可以用这种方式

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

CoPLaS答案解决了我的问题。

如何在Android Marshmallow上使用传统的Apache HTTP客户端?

要继续为API 23+使用Apache HTTP类,请执行以下操作:

首先,一定要将gradle dependencie添加到build.gradle

 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' ... } 

解决这个问题的简单方法是C:\ Users \ username \ AppData \ Local \ Android \ sdk \ platforms。 这里删除你的android-23,然后从SDKpipe理器再次更新你的API 23。 它会解决你的问题。