2014-09-06 3 views
0

Я сделал Contact App с помощью пакетной обработки, как показано нижеОшибки после знака APK

final public class BatchOperation { 
private final String TAG = "BatchOperation"; 
private final ContentResolver mResolver; 
// List for storing the batch mOperations 
private final ArrayList<ContentProviderOperation> mOperations; 

public BatchOperation(Context context, ContentResolver resolver) { 
    mResolver = resolver; 
    mOperations = new ArrayList<ContentProviderOperation>(); 
} 

public int size() { 
    return mOperations.size(); 
} 

public void add(ContentProviderOperation cpo) { 
    mOperations.add(cpo); 
} 

public Uri execute() { 
    Uri result = null; 

    if (mOperations.size() == 0) { 
     return result; 
    } 
    // Apply the mOperations to the content provider 
    try { 
     ContentProviderResult[] results = mResolver.applyBatch(
       ContactsContract.AUTHORITY, mOperations); 
     if ((results != null) && (results.length > 0)) 
      result = results[0].uri; 
    } catch (final OperationApplicationException e1) { 
     Log.e(TAG, "storing contact data failed", e1); 
    } catch (final RemoteException e2) { 
     Log.e(TAG, "storing contact data failed", e2); 
    } 
    mOperations.clear(); 
    return result; 
} 

Все отлично работает в режиме отладки, но после того, как я подписал мое приложение в режиме выпуска я сталкиваюсь с этой проблемой

E/BatchOperation﹕ storing contact data failed 
java.lang.ClassCastException: a cannot be cast to android.content.ContentProviderOperation 
     at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:479) 
     at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:227) 
     at android.content.ContentResolver.applyBatch(ContentResolver.java:951) 

в этой линии

ContentProviderResult[] results = mResolver.applyBatch(ContactsContract.AUTHORITY, 
       mOperations); 

Вот мой ProGuard файл

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontskipnonpubliclibraryclassmembers 
-dontpreverify 
-verbose 
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
-allowaccessmodification 
-keepattributes *Annotation* 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-repackageclasses '' 


-dontwarn com.actionbarsherlock.** 
-dontwarn org.apache.** 
-dontwarn com.commonsware.** 
-dontwarn freemarker.** 
-dontwarn ezvcard.** 

-keep class org.apache.** { *; } 
-keep class android.support.v4.app.** { *; } 
-keep class com.actionbarsherlock.** { *; } 
-keep class ezvcard.** { *; } 
-keep class com.fasterxml.jackson.** { *; } 

Спасибо за чтение,

ответ

1

Когда такого рода вещи случаются, я всегда задаю вопрос к моим коллегам разработчиков ... Вы используете Proguard? Попробуйте отключить Proguard и выполнить компиляцию в режиме выпуска для тестирования. Также удалите оптимизацию с помощью

-dontoptimize 

Также убедитесь, что ваш провайдер контента в настоящее время хранятся с чем-то вроде

-keep public class * extends android.content.ContentProvider 
+0

Да, после отключения proguard все в порядке, –

+0

Попробуйте без опции оптимизации. Я больше не использую его, потому что у него немного проблем. –

+0

Благодарим вас за ответ, но проблема все еще происходит :( –

0

Ах, я узнаю, что Proguard обфускатор android.content.ContentProviderOperation; класса. Просто добавьте это -keep class android.content.** { *; } все работает отлично =)