org.apache.http.NameValuePair在compileSdkVersion 23中不再可用。

5

我有一个帮助类,用于处理请求功能,目前正在使用的一个方法如下。

private String buildQueryString(String url, List<NameValuePair> params) throws IOException {
    StringBuilder sb = new StringBuilder();
    if (params == null) return url;

    for (NameValuePair param : params) {
        sb.append(urlEncode(param.getName()));
        sb.append("=");
        sb.append(urlEncode(param.getValue()));
        sb.append("&");
    }

    return url + "?" + sb.substring(0, sb.length() - 1);
}

如果我将gradle更新到compileSdkVersion 23,那么import org.apache.http.NameValuePair就不存在了。我很想知道它的替代品是什么?谢谢!另外,我正在使用gradle-2.4。
buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
        maven { url 'https://zendesk.artifactoryonline.com/zendesk/repo' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

android {
    signingConfigs {
        debug {
            storeFile file('keystore/debug/debug.keystore')
        }
    }

    compileSdkVersion 23
    buildToolsVersion "21.1.2"
    useLibrary 'org.apache.http.legacy'

    // jenkins setup
    def versionPropsFile = file('version.properties')
    def code = 1;
    if (versionPropsFile.canRead() && versionPropsFile.exists()) {
        def Properties versionProps = new Properties()

        versionProps.load(new FileInputStream(versionPropsFile))
        List<String> runTasks = gradle.startParameter.getTaskNames();
        def value = 0
        for (String item : runTasks) {
            if (item.contains("assembleRelease")) {
                value = 1;
            }
        }
        code = Integer.parseInt(versionProps['VERSION_CODE']).intValue() + value
        versionProps['VERSION_CODE'] = code.toString()
        versionProps.store(versionPropsFile.newWriter(), null)
    } else {
        throw new GradleException("Could not read version.properties!")
    }

    // construct version name
    def versionMajor = 2
    def versionMinor = 3
    def versionPatch = 9

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        versionName "${versionMajor}.${versionMinor}.${versionPatch}"
        versionCode code
        signingConfig signingConfigs.debug

        // enabling multidex support
        multiDexEnabled true
    }

    buildTypes {
        stage {
              <content removed>
        }
        debug {
              <content removed>
        }
        release {
              <content removed>
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }


dependencies {
    <bunch of dependencies>
    compile 'com.android.support:support-v4:23.0.1'
}
2个回答

11

将以下内容添加到您的 build.gradle 文件中

android {
    useLibrary 'org.apache.http.legacy'
}

从API 22开始,org.apache库已被弃用,并在API 23中被删除。

buildToolsVersion '21.1.2'更改为buildToolsVersion '23.0.1'

或者您可以将此内容添加到依赖项中:

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.cli‌​ent:4.1.2'

请注意使用Gradle 1.3.+版本。


你需要将 buildToolsVersion "21.1.2" 更改为 buildToolsVersion '23.0.1'。 - Michele Lacorte
我已经进行了更新,但仍然返回相同的错误。 - portfoliobuilder
你应该在其他android { ... }代码之外添加android { ... },并将targetSdkVersion更改为23,注意使用Gradle 1.3.+。 - Michele Lacorte
1
搞定了!有几种方法,你说得对,但是我通过添加compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'使它工作了。 - portfoliobuilder
1
哈哈,我们想到了一样的事情。我刚刚更新了我的答案并进行了编辑。感谢你的帮助。 - portfoliobuilder
显示剩余2条评论

5

为了详细说明这个问题,面对相同冲突的人们有两种解决方法。正如 @Michele 指出的那样,可以使用 useLibrary 'org.apache.http.legacy',但必须记得同时更新 gradle。

针对 API 23:

顶级 build.gradle - /build.gradle

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

模块特定的 build.gradle - /app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"
    useLibrary 'org.apache.http.legacy'
    ...
}

官方文档:
https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

最新的Android Gradle插件变更日志:http://tools.android.com/tech-docs/new-build-system

解决此问题的第二种方法是将以下内容添加到依赖项中。

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接