1

ユーザーが自分の携帯電話に既にある写真を選択してサーバーにアップロードできるようにするアプリを作成しています。残念ながら、ボタンをクリックして写真をサーバーに送信すると、logcat に次のように表示されます。

Could not find class 'org.apache.http.entity.mime.MultipartEntity', referenced from method com.example.crescentcameraapp.MainActivity$ImageUploadTask.doInBackground

スタック オーバーフローに関する同様の質問をすべて見てきました。

他にもいくつかありますが、重要なのは、どれも良い答えを持っていないということです。ソリューションは次のとおりです。

  • 「必要なすべての jar を http://hc.apache.org/downloads.cgiからダウンロードし、Eclipse の Java ビルド パスに追加します。」**動作しません。私はそれを試し、プロジェクトをきれいにし、Eclipseを閉じたり開いたりしました。何もない。

  • 「すべての jar ファイルをプロジェクトの 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

ありがとう。

4

2 に答える 2

3

私がリンクした関連する質問で提供された解決策に部分的に基づいて、私はそれを理解しました。プロジェクトをクリーンアップし、Eclipse を再起動してから、mime4j をダウンロードしてビルド パスに追加しました。

http://james.apache.org/download.cgi#Apache_Mime4J

上記のページは公式のダウンロードですが、私にはうまくいきませんでした。代替手段として sourceforge を試してください:

http://sourceforge.net/projects/mime4j/?source=dlp

注意:

これを追加すると、ほぼ確実にプロジェクトの bin/dexedLibs で問題が発生します。もしそうなら、あなたはおそらく少し悪夢に見舞われています。複数の jar にわたって定義されている特定のオブジェクト/クラス/例外に関するコンソール エラー メッセージが表示されます。これは、dexedLibs フォルダーに、libs フォルダー内の jar のコピーが表面上含まれているためです。プロジェクトから元のコピー (libs フォルダーにあるもの) を削除し、ソリューションを消去して、再度ビルドします。複数定義されたクラスについてコンソールに新しい苦情が表示される場合がありますが、それは単に、削除する jar が増えることを意味します。これが私が問題を解決した方法です。

于 2013-06-18T20:56:10.470 に答える
0

少なくとも Android プラグインを使用した Eclipse では、「R」および BuildConfig クラスを使用して gen (生成された) フォルダーにクラスを貼り付けると、削除される可能性があることを知っています。

于 2013-06-18T02:04:23.580 に答える