Ошибка при создании приложения для Android: java.util.zip.ZipException: повторяющаяся запись: com/sun/mail/handlers/message_rfc822.class

Я разрабатываю приложение для Android, которое взаимодействует с веб-альбомами Picasa. Итак, я пытался загрузить фотографию, используя следующий код.

   protected Integer doInBackground(String... params) {

        int index = 0;
        int count = 0;
        URL albumPostUrl = null;
        try {
            albumPostUrl = new URL("https://picasaweb.google.com/data/feed/api/user/"+googuserName+"/albumid/" + params[1]);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        while(index < totalFBPicsCount)
        {
            PhotoEntry myPhoto = new PhotoEntry();
            myPhoto.setTitle(new PlainTextConstruct(params[2] + "_" + index));
            myPhoto.setClient("Photo Sync");
            MediaFileSource myMedia = new MediaFileSource(new File(params[0] + "/" + params[2] + "_" +index + ".jpg"), "image/jpeg");
            myPhoto.setMediaSource(myMedia);
            try
            {
            PhotoEntry returPic = myService.insert(albumPostUrl, myPhoto);
            }
            catch (RuntimeException ex)
            {
                ex.printStackTrace();
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
                Log.e("Sai", "PhotSync", ex);
            }
            index++;
        }


        return null;

    }

Я получил следующее исключение при выполнении строки myService.insert(albumPostUrl, myPhoto). Ниже приведена трассировка logcat:

 06-05 01:18:04.086    4272-4422/krishtech.photosync E/dalvikvm﹕ 

    Could not find class 'com.google.gdata.data.media.MediaBodyPart$MediaSourceDataHandler', 
referenced from method com.google.gdata.data.media.MediaBodyPart.initMediaDataHandler 
06-05 01:18:04.091    4272-4422/krishtech.photosync E/dalvikvm﹕ Could not find class 'javax.activation.DataHandler', referenced from method com.google.gdata.data.media.MediaBodyPart.initMediaDataHandler 
06-05 01:18:04.101    4272-4422/krishtech.photosync E/dalvikvm﹕ Could not find class 'javax.mail.internet.CachedDataHandler', referenced from method javax.mail.internet.MimeBodyPart.createCachedDataHandler 
06-05 01:18:04.116    4272-4422/krishtech.photosync E/dalvikvm﹕ Could not find class 'javax.activation.DataHandler', referenced from method javax.mail.internet.MimeBodyPart.attachFile 
06-05 01:18:04.131    4272-4422/krishtech.photosync E/dalvikvm﹕ Could not find class 'javax.activation.DataHandler', referenced from method javax.mail.internet.MimeBodyPart.getDataHandler 
06-05 01:18:04.146    4272-4422/krishtech.photosync E/dalvikvm﹕ Could not find class 'javax.activation.DataHandler', referenced from method javax.mail.internet.MimeBodyPart.setContent 
06-05 01:18:04.146    4272-4422/krishtech.photosync E/dalvikvm﹕ Could not find class 'javax.activation.DataHandler', referenced from method javax.mail.internet.MimeBodyPart.setContent 06-05 01:18:08.866    4272-4422/krishtech.photosync E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #3
            Process: krishtech.photosync, PID: 4272
            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: javax.activation.DataHandler
                    at javax.mail.internet.MimeBodyPart.setContent(MimeBodyPart.java:678)
                    at com.google.gdata.data.media.MediaBodyPart.<init>(MediaBodyPart.java:95)
                    at com.google.gdata.data.media.MediaMultipart.<init>(MediaMultipart.java:126)
                    at com.google.gdata.client.media.MediaService.insert(MediaService.java:390)
                    at krishtech.photosync.MainActivity$startBackuptoGoogle.doInBackground(MainActivity.java:702)
                    at krishtech.photosync.MainActivity$startBackuptoGoogle.doInBackground(MainActivity.java:671)
                    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)

После небольшого поиска выяснилось, что мне нужно использовать порт Java Mail для Android из здесь. Но когда я добавил mail.jar, activation.jar и additional.jar и попытался создать приложение, я получаю следующую ошибку в консоли Gradle.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
> java.util.zip.ZipException: duplicate entry: com/sun/mail/handlers/message_rfc822.class

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED 

Затем я вижу, что во внешних библиотеках есть библиотеки активации-1.1 и почты-1.4 в дополнение к библиотекам в папке libs (mail.jar, активация.jar, дополнительный.jar). Внешние библиотеки (почта-1.4 и активация-1.1) включаются автоматически, поскольку они являются необходимыми зависимостями для клиентской библиотеки Google Data Java, которую я использую для получения данных из picasa. Пожалуйста, найдите ниже build.gradle :

apply plugin: 'com.android.application'
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "krishtech.photosync"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'
    compile 'com.google.android.gms:play-services-identity:7.5.0'
    compile('com.google.gdata:core:1.47.1') 
    compile('com.google.api-client:google-api-client:1.16.0-rc') {
        exclude(group: 'xpp3', module: 'xpp3') 
        exclude(group: 'org.apache.httpcomponents', module: 'httpclient') 
        exclude(group: 'junit', module: 'junit') 
        exclude(group: 'com.google.android', module: 'android') 
    }
    compile('com.google.api-client:google-api-client-android:1.16.0-rc') {
        exclude(group: 'com.google.android.google-play-services', module: 'google-play-services')
    }
    compile files('libs/activation.jar')
    compile files('libs/additionnal.jar')
    compile files('libs/mail.jar')
}

Так что теперь я в затруднительном положении. Если мне нужно удалить mail-1.4 в папке «Внешние библиотеки» (что я не могу сделать, пожалуйста, дайте мне знать, как мне это сделать), то это может привести к сбою в работе библиотеки gdata, и если я не включу java-порт почты .jar Возможно, я не смогу загрузить фотографию. Пожалуйста, предложите, как мне решить эту проблему.


person thedataguy    schedule 05.06.2015    source источник
comment
У вас есть libs/*.jar, а также три библиотеки явно в разделе зависимостей - это преднамеренно? Я не Android-разработчик, но мне это кажется плохой идеей.   -  person Jon Skeet    schedule 05.06.2015
comment
Не заметил этого. Кажется, это было добавлено Android Studio. Я удалил эти строки и перестроил их, и у меня все еще есть та же ошибка, что и при использовании com.google.gdata:core:1.47.1, для которого mail-1.4.jar автоматически добавляется как обязательная зависимость.   -  person thedataguy    schedule 05.06.2015


Ответы (1)


Ну я решил этот вопрос. Хитрость заключалась в том, чтобы исключить mail-1.4.jar, который идет вместе с com.google.gdata:core:1.47.1, при создании приложения. Внес следующие изменения в build.gradle, и теперь мое приложение работает, а также я могу загружать фотографии в Picasa, используя Android-порт почтовой библиотеки Java.

compile('com.google.gdata:core:1.47.1') {
    exclude(group: 'javax.mail', module: 'mail')
}
person thedataguy    schedule 05.06.2015