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();
}
这对新手机和旧手机都适用。我想打人..谢谢!
我正在开发一个将图像上传到服务器的应用程序。这在新的 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();
}
这对新手机和旧手机都适用。我想打人..谢谢!