java.lang.NoClassDefFoundError: org.apache.http.entity.mime.content.FileBody in old phones during runtime

java.lang.NoClassDefFoundError: org.apache.http.entity.mime.content.FileBody in old phones during runtime

我正在开发一个将图像上传到服务器的应用程序。这在新的 phones 中工作得很好,但是当我 运行 在旧的 运行 中我得到这个错误,即使正确添加了所有依赖项:

java.lang.NoClassDefFoundError: org.apache.http.entity.mime.content.FileBody

请注意,不使用多部分 post 的简单消息可以完美运行。

这是 phone 数据:

APP_VERSION_CODE=51
APP_VERSION_NAME=2.61
ANDROID_VERSION=4.1.2
PHONE_MODEL=GT-I8190N

gradle配置:

android {

compileSdkVersion 23
buildToolsVersion '25.0.0'
defaultConfig {
    minSdkVersion 14
    targetSdkVersion
    multiDexEnabled true
    versionCode 51
    versionName "2.61"
}


...
    useLibrary 'org.apache.http.legacy'
...

}


dependencies {

...

    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
    compile('org.apache.httpcomponents:httpmime:4.3') {
        exclude module: "httpclient"
    }

}

这是我正在使用的代码:

  HttpClient client = getHTTPClientAC(true);
    HttpPost post = getACPost(url);
    FileBody fb = new FileBody(toUploadFile);
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    //

    builder.addPart("file", fb);
    final HttpEntity yourEntity = builder.build();
    post.setEntity(yourEntity);

我试过使用 mimetypes 的旧版本,但还是一样的错误。

我解决了这个问题。我从这里更改了 apache 导入:

import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;

为此:

import com.android.internal.http.multipart.FilePart;
import com.android.internal.http.multipart.MultipartEntity;
import com.android.internal.http.multipart.Part;
import com.android.internal.http.multipart.StringPart;

代码改为:

    Part[] parts = new Part[1];
    try {
        parts[0] = new FilePart("file", toUploadFile);
        MultipartEntity multipartEntity = new MultipartEntity(parts);
        post.setEntity(multipartEntity);
    } catch (Exception e) {
        e.printStackTrace();
    }

这对新手机和旧手机都适用。我想打人..谢谢!