java - Android-Studio 找不到导致 java.lang.NoClassDefFoundError 的类

标签 java android

如何解决这个错误?我尽我所能,但我仍然收到此错误

引起:java.lang.NoClassDefFoundError: info.androidhive.camerafileupload.MyMultiPartEntity

我正在使用这些库

  • httpclient-4.2.5.jar,
  • httpcore-4.2.4.jar,
  • httpmime-4.2.5.jar

我从 http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/ 得到这个代码

这是我的异步任务:

private class UploadFileToServer extends AsyncTask<Void, Integer, String> {
        @Override
        protected void onPreExecute() {
            // setting progress bar to zero
            progressBar.setProgress(0);
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            // Making progress bar visible
            progressBar.setVisibility(View.VISIBLE);

            // updating progress bar value
            progressBar.setProgress(progress[0]);

            // updating percentage value
            txtPercentage.setText(String.valueOf(progress[0]) + "%");
        }

        @Override
        protected String doInBackground(Void... params) {
            return uploadFile();
        }

        private String uploadFile() {
            String responseString = null;

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(Config.FILE_UPLOAD_URL);

            try {
                MyMultiPartEntity entity = new MyMultiPartEntity( // Casuing NoClassDefFoundError
                        new ProgressListener() {
                            @Override
                            public void transferred(long num) {
                                publishProgress((int) ((num / (float) totalSize) * 100));
                            }
                        });

                File sourceFile = new File(filePath);

                // Adding file data to http body
                entity.addPart("image", new FileBody(sourceFile));

                // Extra parameters if you want to pass to server
                entity.addPart("website",
                        new StringBody("www.androidhive.info"));
                entity.addPart("email", new StringBody("abc@gmail.com"));

                totalSize = entity.getContentLength();
                httppost.setEntity(entity);

                // Making server call
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity r_entity = response.getEntity();

                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 200) {
                    // Server response
                    responseString = EntityUtils.toString(r_entity);
                } else {
                    responseString = "Error occurred! Http Status Code: "
                            + statusCode;
                }

            } catch (ClientProtocolException e) {
                responseString = e.toString();
            } catch (IOException e) {
                responseString = e.toString();
            }/* catch(NoClassDefFoundError e){
                responseString = e.toString();
            }*/

            return responseString;

        }

        @Override
        protected void onPostExecute(String result) {
            Log.e(TAG, "Response from server: " + result);

            // showing the server response in an alert dialog
            showAlert(result);

            super.onPostExecute(result);
        }

    }

这是我的多部分实体

public class MyMultiPartEntity extends MultipartEntity {

    private final ProgressListener listener;

    public MyMultiPartEntity(final ProgressListener listener) {
        super();
        this.listener = listener;
    }

    public MyMultiPartEntity(final HttpMultipartMode mode,
                             final ProgressListener listener) {
        super(mode);
        this.listener = listener;
    }

    public MyMultiPartEntity(HttpMultipartMode mode, final String boundary,
                             final Charset charset, final ProgressListener listener) {
        super(mode, boundary, charset);
        this.listener = listener;
    }

    @Override
    public void writeTo(final OutputStream outStream) throws IOException {
        super.writeTo(new CountingOutputStream(outStream, this.listener));
    }

    public interface ProgressListener {
        void transferred(long num);
    }

    public static class CountingOutputStream extends FilterOutputStream {

        private final ProgressListener listener;
        private long transferred;

        public CountingOutputStream(final OutputStream out,
                final ProgressListener listener) {
            super(out);
            this.listener = listener;
            this.transferred = 0;
        }

        public void write(byte[] b, int off, int len) throws IOException {
            out.write(b, off, len);
            this.transferred += len;
            this.listener.transferred(this.transferred);
        }

        public void write(int b) throws IOException {
            out.write(b);
            this.transferred++;
            this.listener.transferred(this.transferred);
        }
    }
}

日志:

07-03 13:56:05.128  32464-32464/info.androidhive.camerafileupload E/dalvikvm﹕ Could not find class 'info.androidhive.camerafileupload.MyMultiPartEntity', referenced from method info.androidhive.camerafileupload.UploadActivity$UploadFileToServer.uploadFile
07-03 13:56:05.158  32464-32549/info.androidhive.camerafileupload E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: info.androidhive.camerafileupload, PID: 32464
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.NoClassDefFoundError: info.androidhive.camerafileupload.MyMultiPartEntity
            at info.androidhive.camerafileupload.UploadActivity$UploadFileToServer.uploadFile(UploadActivity.java:151)
            at info.androidhive.camerafileupload.UploadActivity$UploadFileToServer.doInBackground(UploadActivity.java:141)
            at info.androidhive.camerafileupload.UploadActivity$UploadFileToServer.doInBackground(UploadActivity.java:119)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

Gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "info.androidhive.camerafileupload"
        minSdkVersion 11
        targetSdkVersion 21
    }
    buildTypes {
        release {
            minifyEnabled false;
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    productFlavors {
    }
}

dependencies {
    provided files('libs/httpclient-4.2.5.jar')
    provided files('libs/httpcore-4.2.4.jar')
    provided files('libs/httpmime-4.2.5.jar')
    provided files('libs/android-support-v4.jar')
    compile 'com.android.support:appcompat-v7:22.1.1'
}

最佳答案

我实际上将这个确切的教程移植到 Android Studio 一段时间后,遇到了与您面临的完全相同的问题。

在尝试了很多方法来修复它之后,我就是这样让它工作的。

使用以下 jar :

然后,在你的 build.gradle 中:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'

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

GitHub 上的完整项目:

https://github.com/dmnugent80/CameraPhotoUpload

关于java - Android-Studio 找不到导致 java.lang.NoClassDefFoundError 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197815/

相关文章:

java - 如何使用带有 spring api 的 JPA 查询进行软删除?

Java增加数组大小

java - Android:使用 Intent 和 FileProvider 打开 Word 文档

android - 在sqlite中创建多个表

android - java.lang.NoClassDefFoundError : com. google.firebase.FirebaseOptions 我尝试了所有解决方案但我不知道解决方案

android - 在 TextView 上对齐图像和文本

java - JDBI 查询返回 MSSQL datetimeoffset(4) 列的错误值?

java - App Engine 无法下载超过 33MB 的文件

java - 在 mySQL 中创建数据库似乎无法正常工作

Android 设备移动速度