来自扩展文件的 VideoView 的 MediaPlayer.prepareAsync() 中的 IllegalStateException
IllegalStateException in VideoView's MediaPlayer.prepareAsync() from Expansion File
我有一个包含 mp4 视频的扩展文件 (zip),我想用 VideoView 播放。当调用 videoView.setVideoURI() 时,它会在我的 VideoView 的 openVideo() 中抛出 IllegalStateException(在状态 1 中调用 prepareAsync)。我从扩展的 APEZProvider class.
检索视频的 URI
扩展文件如下打包并重命名为"main.3.com.my.application.obb"
zip -r -0 [desiredZipFileName.obb] [folderWithVideos]
VideoView:
Uri uri = ExpansionAPEZProvider.buildUri("vid_intro.mp4");
videoView = (VideoView) activity.findViewById(R.id.videoview);
videoView.setVideoURI(uri);
videoView.requestFocus();
videoView.start();
自定义 APEZ 提供程序 class。
public class ExpansionAPEZProvider extends APEZProvider {
private static final String AUTHORITY = AndroidApplication.getApplication().getPackageName() + ".provider." + ExpansionAPEZProvider.class.getSimpleName();
@Override
public String getAuthority() {
return AUTHORITY;
}
public static Uri buildUri(String path) {
StringBuilder contentPath = new StringBuilder("content://");
contentPath.append(AUTHORITY);
contentPath.append(File.separator);
contentPath.append(path);
String newPath = contentPath.toString();
return Uri.parse(newPath);
}
}
buildUri() returns 像这样的 URI
"content://com.my.application.provider.ExpansionAPEZProvider/vid_intro.mp4"
清单中的提供商:
<provider android:name=".ExpansionAPEZProvider"
android:authorities="com.my.application.provider.ExpansionAPEZProvider"
android:exported="false"
android:multiprocess="true">
<meta-data
android:name="mainVersion"
android:value="3"/>
</provider>
StackTrace
V/WindowManager( 749): Adding window Window{683bb62 u0 SurfaceView} at 13 of 21 (before Window{22e3dff1 u0 com.my.application/com.my.application.activity.StartActivity})
I/MediaFocusControl( 749): AudioFocus requestAudioFocus() from android.media.AudioManager@2335d19 req=1flags=0x0
E/MediaPlayer(15769): prepareAsync called in state 1
D/AndroidRuntime(15769): Shutting down VM
E/AndroidRuntime(15769): FATAL EXCEPTION: main
E/AndroidRuntime(15769): Process: com.my.application, PID: 15769
E/AndroidRuntime(15769): java.lang.IllegalStateException
E/AndroidRuntime(15769): at android.media.MediaPlayer.prepareAsync(Native Method)
E/AndroidRuntime(15769): at android.widget.VideoView.openVideo(VideoView.java:356)
E/AndroidRuntime(15769): at android.widget.VideoView.access00(VideoView.java:72)
E/AndroidRuntime(15769): at android.widget.VideoView.surfaceCreated(VideoView.java:628)
E/AndroidRuntime(15769): at android.view.SurfaceView.updateWindow(SurfaceView.java:580)
E/AndroidRuntime(15769): at android.view.SurfaceView.onPreDraw(SurfaceView.java:176)
E/AndroidRuntime(15769): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
E/AndroidRuntime(15769): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1970)
E/AndroidRuntime(15769): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
E/AndroidRuntime(15769): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
E/AndroidRuntime(15769): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
E/AndroidRuntime(15769): at android.view.Choreographer.doCallbacks(Choreographer.java:580)
E/AndroidRuntime(15769): at android.view.Choreographer.doFrame(Choreographer.java:550)
E/AndroidRuntime(15769): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
E/AndroidRuntime(15769): at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime(15769): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(15769): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(15769): at android.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime(15769): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(15769): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(15769): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime(15769): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
W/ActivityManager( 749): Force finishing activity 1 com.my.application/.activity.StartActivity
W/DropBoxManagerService( 749): Dropping: data_app_crash (1630 > 0 bytes)
I/WindowManager( 749): Screenshot max retries 4 of Token{2d07c562 ActivityRecord{3b01f344 u0 com.my.application/.activity.StartActivity t8900 f}} appWin=Window{683bb62 u0 SurfaceView} drawState=3
感谢您的帮助
我修好了。 zip/obb 文件一定已经损坏。我按照上面 post 中的描述通过终端再次打包它,现在它可以工作了。我花了很长时间才找到问题所在。
FileNotFoundException 或 IOException 而不是 IllegalStateException 对我定位问题更有帮助。
我有一个包含 mp4 视频的扩展文件 (zip),我想用 VideoView 播放。当调用 videoView.setVideoURI() 时,它会在我的 VideoView 的 openVideo() 中抛出 IllegalStateException(在状态 1 中调用 prepareAsync)。我从扩展的 APEZProvider class.
检索视频的 URI扩展文件如下打包并重命名为"main.3.com.my.application.obb"
zip -r -0 [desiredZipFileName.obb] [folderWithVideos]
VideoView:
Uri uri = ExpansionAPEZProvider.buildUri("vid_intro.mp4");
videoView = (VideoView) activity.findViewById(R.id.videoview);
videoView.setVideoURI(uri);
videoView.requestFocus();
videoView.start();
自定义 APEZ 提供程序 class。
public class ExpansionAPEZProvider extends APEZProvider {
private static final String AUTHORITY = AndroidApplication.getApplication().getPackageName() + ".provider." + ExpansionAPEZProvider.class.getSimpleName();
@Override
public String getAuthority() {
return AUTHORITY;
}
public static Uri buildUri(String path) {
StringBuilder contentPath = new StringBuilder("content://");
contentPath.append(AUTHORITY);
contentPath.append(File.separator);
contentPath.append(path);
String newPath = contentPath.toString();
return Uri.parse(newPath);
}
}
buildUri() returns 像这样的 URI
"content://com.my.application.provider.ExpansionAPEZProvider/vid_intro.mp4"
清单中的提供商:
<provider android:name=".ExpansionAPEZProvider"
android:authorities="com.my.application.provider.ExpansionAPEZProvider"
android:exported="false"
android:multiprocess="true">
<meta-data
android:name="mainVersion"
android:value="3"/>
</provider>
StackTrace
V/WindowManager( 749): Adding window Window{683bb62 u0 SurfaceView} at 13 of 21 (before Window{22e3dff1 u0 com.my.application/com.my.application.activity.StartActivity})
I/MediaFocusControl( 749): AudioFocus requestAudioFocus() from android.media.AudioManager@2335d19 req=1flags=0x0
E/MediaPlayer(15769): prepareAsync called in state 1
D/AndroidRuntime(15769): Shutting down VM
E/AndroidRuntime(15769): FATAL EXCEPTION: main
E/AndroidRuntime(15769): Process: com.my.application, PID: 15769
E/AndroidRuntime(15769): java.lang.IllegalStateException
E/AndroidRuntime(15769): at android.media.MediaPlayer.prepareAsync(Native Method)
E/AndroidRuntime(15769): at android.widget.VideoView.openVideo(VideoView.java:356)
E/AndroidRuntime(15769): at android.widget.VideoView.access00(VideoView.java:72)
E/AndroidRuntime(15769): at android.widget.VideoView.surfaceCreated(VideoView.java:628)
E/AndroidRuntime(15769): at android.view.SurfaceView.updateWindow(SurfaceView.java:580)
E/AndroidRuntime(15769): at android.view.SurfaceView.onPreDraw(SurfaceView.java:176)
E/AndroidRuntime(15769): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
E/AndroidRuntime(15769): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1970)
E/AndroidRuntime(15769): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
E/AndroidRuntime(15769): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
E/AndroidRuntime(15769): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
E/AndroidRuntime(15769): at android.view.Choreographer.doCallbacks(Choreographer.java:580)
E/AndroidRuntime(15769): at android.view.Choreographer.doFrame(Choreographer.java:550)
E/AndroidRuntime(15769): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
E/AndroidRuntime(15769): at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime(15769): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(15769): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(15769): at android.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime(15769): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(15769): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(15769): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime(15769): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
W/ActivityManager( 749): Force finishing activity 1 com.my.application/.activity.StartActivity
W/DropBoxManagerService( 749): Dropping: data_app_crash (1630 > 0 bytes)
I/WindowManager( 749): Screenshot max retries 4 of Token{2d07c562 ActivityRecord{3b01f344 u0 com.my.application/.activity.StartActivity t8900 f}} appWin=Window{683bb62 u0 SurfaceView} drawState=3
感谢您的帮助
我修好了。 zip/obb 文件一定已经损坏。我按照上面 post 中的描述通过终端再次打包它,现在它可以工作了。我花了很长时间才找到问题所在。 FileNotFoundException 或 IOException 而不是 IllegalStateException 对我定位问题更有帮助。