Android ClassCastException:MultipartEntityBuilder无法转为HttpEntity
解决Android中MultipartEntityBuilder与HttpEntity的类型转换异常
异常信息
E/AndroidRuntime: FATAL EXCEPTION: Thread-5 Process: com.comm.a, PID: 4981 java.lang.ClassCastException: org.apache.http.entity.mime.MultipartEntityBuilder cannot be cast to com.google.firebase.crashlytics.buildtools.reloc.org.apache.http.HttpEntity at com.comm.a.Utils.Connecter.connect(Connecter.java:123) at com.comm.a.Utils.Sync.sendOrder(Sync.java:384) at com.comm.a.Activity.Result$10.run(Result.java:919) at java.lang.Thread.run(Thread.java:764)
相关代码
Connecter类connect方法
public static void connect(List<NameValuePair> params, Context context, File file) { setDate(context); checkError(); Log.d("Anpah", "connect"); try { // DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); HttpClient defaultHttpClient = HttpClientBuilder.create().build(); String paramString = URLEncodedUtils.format(params, "UTF-8"); HttpPost httpPost = new HttpPost(url + paramString); StringBuilder sb = new StringBuilder(); sb.append("Basic "); sb.append(Base64.encodeToString((login + ":" + password).getBytes(), 2)); httpPost.addHeader(HttpHeaders.AUTHORIZATION, sb.toString()); MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); multipartEntity.addPart("sendOrder", new FileBody(file)); httpPost.setEntity((HttpEntity) multipartEntity); // 问题代码行 HttpResponse httpResponse = defaultHttpClient.execute(httpPost); HttpEntity responseEntity = httpResponse.getEntity(); content = responseEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); Log.d("Anpah_error", "Connect error 1 " + e.getMessage()); setError(true); errorMsg = e.getMessage(); } catch (ClientProtocolException e2) { e2.printStackTrace(); Log.d("Anpah_error", "Connect error 2 " + e2.getMessage()); setError(true); errorMsg = e2.getMessage(); } catch (IOException e3) { e3.printStackTrace(); Log.d("Anpah_error", "Connect error 3 " + e3.getMessage()); setError(true); errorMsg = e3.getMessage(); } }
app模块build.gradle配置
plugins { id 'com.android.application' } android { packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/INDEX.LIST' } compileSdk 32 defaultConfig { applicationId "com.comm.a" minSdk 23 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // useLibrary 'org.apache.http.legacy' } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.firebase:firebase-crashlytics-buildtools:2.9.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' // implementation 'com.flurry.android:analytics:13.3.0@aar' implementation group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.3.5' }
问题分析与修复方案
核心问题
- 类型转换逻辑错误:
MultipartEntityBuilder是构建器类,并非HttpEntity的实现类,直接强制转换必然抛出异常,需调用其build()方法生成HttpEntity实例。 - 依赖类冲突:Firebase Crashlytics buildtools重定位了Apache Http类,导致引入的
httpmime库中的类与Firebase重定位的类加载冲突。
修复步骤
1. 修正类型转换代码
将问题代码行替换为:
HttpEntity entity = multipartEntity.build(); httpPost.setEntity(entity);
2. 解决依赖冲突
在android块的packagingOptions中添加规则,优先使用引入的httpmime库中的类:
android { packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/INDEX.LIST' pickFirst 'org/apache/http/**/*.class' } }
3. 可选:启用Apache Legacy库
如果仍存在Apache Http类找不到问题,取消defaultConfig中的注释:
defaultConfig { useLibrary 'org.apache.http.legacy' }
内容的提问来源于stack exchange,提问作者Art N
相关产品推荐
相关产品推荐

