2014-11-13 10 views
11

Tôi gặp sự cố với Proguard và VideoView tùy chỉnh cho ứng dụng của mình. Dường như làm xáo trộn mã của tôi gây ra sự cố với VideoView của tôi. Bất cứ khi nào tôi cố gắng đặt OnPreparedListener cho video, ứng dụng của tôi gặp sự cố. Xem:NoSuchMethodError cho VideoView.setOnPreparedListener()

11-13 15:54:45.881 19428-19428/com.<REDACTED> E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.<REDACTED>, PID: 19428 
java.lang.NoSuchMethodError: No virtual method setOnPreparedListener(Landroid/media/MediaPlayer$e;)V in class Landroid/widget/VideoView; or its super classes (declaration of 'android.widget.VideoView' appears in /system/framework/framework.jar:classes2.dex) 
     at com.<REDACTED>.ui.module.MHVideoPlayerModule.initializeVideoPlayer(MHVideoPlayerModule.java:174) 
     at com.<REDACTED>.ui.module.MHVideoPlayerModule.initializeViewData(MHVideoPlayerModule.java:154) 
     at com.<REDACTED>.ui.activity.MHVideoDetailActivity.a(MHVideoDetailActivity.java:198) 
     at com.<REDACTED>.ui.activity.MHVideoDetailActivity.b(MHVideoDetailActivity.java:171) 
     at com.<REDACTED>.ui.activity.MHVideoDetailActivity.a_(MHVideoDetailActivity.java:255) 
     at com.<REDACTED>.service.f.al.b(MHVideoUrlTaskManager.java:131) 
     at com.<REDACTED>.service.a.e.onPostExecute(MHAsyncServiceTask.java:194) 
     at android.os.AsyncTask.finish(AsyncTask.java:632) 
     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
     ... 

Tôi đã thử thêm các dòng dưới đây vào tệp Proguard, nhưng chúng không giúp ích gì.

-keep class com.<REDACTED>.ui.module.MHVideoPlayerModule { *; } 
-keep class android.widget.VideoView { *; } 

EDIT: Đây là proguard-project.txt file:

# If your project uses WebView with JS, uncomment the following 
# and specify the fully qualified class name to the JavaScript interface 
# class: 
-keepclassmembers class com.<REDACTED>.common.JavaScriptInterface { 
    public *; 
} 

# Google Play Services start 
# https://developer.android.com/google/play-services/setup.html 
-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 

-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 
# Google Play Services end 

-dontwarn javax.jdo.** 
-dontwarn javax.naming.** 
-dontwarn com.google.api.client.googleapis.extensions.android.gms.** 
-dontwarn com.google.android.gms.** 
-dontwarn com.squareup.okhttp.** 

-keep public class android.net.http.SslError 
-keep public class android.webkit.WebViewClient 
-keep public class android.widget.VideoView 

-dontwarn android.webkit.WebView 
-dontwarn android.net.http.SslError 
-dontwarn android.webkit.WebViewClient 
-dontwarn android.media.MediaPlayer 
-dontwarn android.widget.VideoView 

-dontwarn org.bouncycastle.** 
-dontwarn org.apache.commons.codec.binary.Base64 

-keepattributes SourceFile,LineNumberTable 
-printusage build/outputs/proguard/unused.txt 
-printconfiguration build/outputs/proguard/configuration.txt 

-libraryjars libs 

-keep class com.crashlytics.** { *; } 
-keep class io.fabric.** { *; } 
-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class com.facebook.** { *; } 

# New Relic start 
# https://docs.newrelic.com/docs/mobile-monitoring/mobile-monitoring-installation/android/installing-android-apps-gradle-android-studio#proguard 
-keep class com.newrelic.** { *; } 
-dontwarn com.newrelic.** 
-keepattributes Exceptions, Signature, InnerClasses 
# New Relic end 

-dontshrink 
+0

đang Proguard để tái tạo các vấn đề sẽ được tốt đẹp. – Simas

+0

Đã thêm tệp '' 'progaurd-project.txt''' vào bài đăng gốc. –

Trả lời

4

Có vẻ bạn cũng đang cung cấp tùy chỉnh android.media.MediaPlayer và/hoặc android.media.MediaPlayer.OnPreparedListener triển khai:

java.lang.NoSuchMethodError: No virtual method setOnPreparedListener(Landroid/media/MediaPlayer$e;)V in class Landroid/widget/VideoView; or its super classes (declaration of 'android.widget.VideoView' appears in /system/framework/framework.jar:classes2.dex)

setOnPreparedListener - Phương pháp bạn đang gọi

(L - Các smali tiền tố cho các đối tượng

android/media/MediaPlayer$e - Tên kiểu thực tế mà bạn đang cố gắng để vượt qua trong phương pháp này. Đây là vấn đề. Loại lớp bên trong OnPreparedListener đang trở nên khó hiểu. Phải là android/media/MediaPlayer$OnPreparedListener

android/widget/VideoView lớp đang cố lưu trữ chữ ký phương thức này.


Bạn có tùy chỉnh MediaPlayer hoặc MediaPlayer.OnPreparedListener sử dụng tên gói ban đầu không? Nếu vậy, bạn cũng cần phải loại trừ những người từ Proguard. Một cái gì đó như:

-keep class android.media.** { *; }

+0

'' '-keep class android.media. ** {*; } '' 'đã làm việc! Cảm ơn nhiều. Chúng ta có một cá thể riêng của '' 'MediaPlayer.OnPreparedListener''' trong' '' MHVideoPlayerModule''' của chúng ta –

1

chỉ cần kiểm tra nó ra bằng cách chèn bên dưới dòng trong "progaurd-project.txt" của bạn tập tin

-keep class android.widget.** { *; } 
+0

Điều này không hoạt động. Tôi vẫn còn gặp tai nạn tương tự. –

Các vấn đề liên quan