Android/Java: не удается найти класс MultipartEntity, несмотря на добавление его в путь сборки
Я пишу приложение, которое позволяет пользователю выбрать фотографию, уже находящуюся на его телефоне, и загрузить ее на сервер. К сожалению, когда я нажимаю кнопку, чтобы отправить фотографию на сервер, в logcat я вижу:
Could not find class 'org.apache.http.entity.mime.MultipartEntity', referenced from method com.example.crescentcameraapp.MainActivity$ImageUploadTask.doInBackground
Я видел все похожие вопросы о переполнении стека:
Android размещает изображение на сервере с помощью MultipartEntity
Dalvik не может найти класс внутри внешнего JAR через отражение
Есть еще несколько, но суть в том, что ни у одного из них нет хорошего ответа. Решения включают в себя:
"Загрузите все необходимые файлы jar с http://hc.apache.org/downloads.cgi и добавьте их в путь сборки Java в Eclipse". ** не работает. Я попробовал, очистил проект, закрыл / открыл Eclipse. Ничего такого.
"Добавьте все файлы в папку libs в вашем проекте, Android сделает все остальное". ** Тем не менее, это не работает. Я не знаю почему.
По какой-то причине, даже несмотря на то, что он отправляет эту ошибку в logcat, он продолжает работать и падает только позже, когда я пытаюсь использовать объект MultiPartEntity, который я создал в коде. Вот остальная часть logcat:
06-17 21:21:34.396: E/dalvikvm(14917): Could not find class 'org.apache.http.entity.mime.MultipartEntity', referenced from method com.example.crescentcameraapp.MainActivity$ImageUploadTask.doInBackground
06-17 21:21:34.396: W/dalvikvm(14917): VFY: unable to resolve new-instance 652 (Lorg/apache/http/entity/mime/MultipartEntity;) in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;
06-17 21:21:34.396: D/dalvikvm(14917): VFY: replacing opcode 0x22 at 0x002b
06-17 21:21:34.396: I/dalvikvm(14917): DexOpt: unable to optimize static field ref 0x0422 at 0x2d in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;.doInBackground
06-17 21:21:34.396: D/dalvikvm(14917): DexOpt: unable to opt direct call 0x10e8 at 0x2f in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;.doInBackground
06-17 21:21:34.396: D/dalvikvm(14917): DexOpt: unable to opt direct call 0x10eb at 0x56 in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;.doInBackground
06-17 21:21:34.396: D/dalvikvm(14917): DexOpt: unable to opt direct call 0x10eb at 0x62 in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;.doInBackground
06-17 21:21:34.396: D/dalvikvm(14917): DexOpt: unable to opt direct call 0x10ea at 0x6e in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;.doInBackground
06-17 21:21:34.396: D/dalvikvm(14917): DexOpt: unable to opt direct call 0x10eb at 0x85 in Lcom/example/crescentcameraapp/MainActivity$ImageUploadTask;.doInBackground
06-17 21:21:34.401: W/dalvikvm(14917): threadid=11: thread exiting with uncaught exception (group=0x412192a0)
06-17 21:21:34.406: E/AndroidRuntime(14917): FATAL EXCEPTION: AsyncTask #1
06-17 21:21:34.406: E/AndroidRuntime(14917): java.lang.RuntimeException: An error occured while executing doInBackground()
06-17 21:21:34.406: E/AndroidRuntime(14917): at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-17 21:21:34.406: E/AndroidRuntime(14917): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.lang.Thread.run(Thread.java:856)
06-17 21:21:34.406: E/AndroidRuntime(14917): Caused by: java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity
06-17 21:21:34.406: E/AndroidRuntime(14917): at com.example.crescentcameraapp.MainActivity$ImageUploadTask.doInBackground(MainActivity.java:244)
06-17 21:21:34.406: E/AndroidRuntime(14917): at com.example.crescentcameraapp.MainActivity$ImageUploadTask.doInBackground(MainActivity.java:1)
06-17 21:21:34.406: E/AndroidRuntime(14917): at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-17 21:21:34.406: E/AndroidRuntime(14917): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-17 21:21:34.406: E/AndroidRuntime(14917): ... 5 more
06-17 21:21:43.731: I/Choreographer(14917): Skipped 534 frames! The application may be doing too much work on its main thread.
06-17 21:21:44.856: E/WindowManager(14917): Activity com.example.crescentcameraapp.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41c93710 that was originally added here
06-17 21:21:44.856: E/WindowManager(14917): android.view.WindowLeaked: Activity com.example.crescentcameraapp.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41c93710 that was originally added here
Есть еще кое-что, но вы поняли. Ниже приведен соответствующий код. ImageUploadTask - это внутренний класс:
class ImageUploadTask extends AsyncTask <Void, Void, String>{
@SuppressWarnings("deprecation")
@Override
protected String doInBackground(Void... unsued) {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httpPost = new HttpPost(
getString(R.string.web_url_text)
+ "/test.php"
);
MultipartEntity entity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
imageBMP.compress(CompressFormat.JPEG, 100, bos);
byte[] data = bos.toByteArray();
entity.addPart("photoId", new StringBody(getIntent()
.getStringExtra("photoId")));
entity.addPart("returnformat", new StringBody("json"));
entity.addPart("uploaded", new ByteArrayBody(data,
"myImage.jpg"));
String captionText = findViewById(R.string.caption_text).toString();
entity.addPart("photoCaption", new StringBody(captionText));
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost,
localContext);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));
String sResponse = reader.readLine();
return sResponse;
} catch (Exception e) {
if (dialog.isShowing())
dialog.dismiss();
Toast.makeText(getApplicationContext(),
"Error sending file to server...",
Toast.LENGTH_LONG).show();
Log.e(e.getClass().getName(), e.getMessage(), e);
return null;
}//end of catch
}
protected void onPostExecute(String sResponse) {
Toast.makeText(getApplicationContext(), "Upload completed.", Toast.LENGTH_LONG).show();
}//onPostExecute()
}//end of class ImageUploadTask
Благодарю.
2 ответа
Я понял это, частично основываясь на решениях, представленных в соответствующих вопросах, с которыми я связан. Я очистил проект, перезапустил eclipse, а затем скачал и добавил mime4j в путь сборки:
http://james.apache.org/download.cgi
Вышеуказанная страница является официальной загрузкой, но она не работает для меня. Попробуйте sourceforge для альтернативы:
http://sourceforge.net/projects/mime4j/?source=dlp
Осторожно:
Добавление этого почти наверняка вызовет проблемы с bin/dexedLibs в вашем проекте. Если это так, то, вероятно, вас ждет кошмар. Вы получите сообщения об ошибках консоли об определенных объектах / классах / исключениях, определенных в нескольких банках. Это потому, что папка dexedLibs якобы содержит копии jar-файлов в папке libs. Просто удалите оригинальную копию (ту, что находится в папке libs) из вашего проекта, очистите решение и соберите его заново. Вы можете получать новые жалобы в консоли на множественные классы, но это просто означает, что у вас есть больше jar-файлов для удаления. Вот как я решил проблему.
Я знаю, по крайней мере, с Eclipse с плагином для Android, что если вы добавите класс в папку gen (генерируется) с классами "R" и BuildConfig, он может быть удален.