我有一个应用程序,其主要目标是播放特定的视频文件。
有时它可以正确播放视频。但其他时候它会给我这个错误:
03-21 14:52:36.181: I/AwesomePlayer(119):
setDataSource_l('/data/data/my.package.name/files/MyMovie.mp4')
03-21 14:52:36.196: W/VideoView(26612): Unable to open content: /data/data/my.package.name/files/MyMovie.mp4
03-21 14:52:36.196: W/VideoView(26612): java.lang.IllegalArgumentException: The surface has been released
03-21 14:52:36.196: W/VideoView(26612): at android.media.MediaPlayer._setVideoSurface(Native Method)
03-21 14:52:36.196: W/VideoView(26612): at android.media.MediaPlayer.setDisplay(MediaPlayer.java:633)
03-21 14:52:36.196: W/VideoView(26612): at android.widget.VideoView.openVideo(VideoView.java:222)
03-21 14:52:36.196: W/VideoView(26612): at android.widget.VideoView.access$2000(VideoView.java:49)
03-21 14:52:36.196: W/VideoView(26612): at android.widget.VideoView$6.surfaceCreated(VideoView.java:465)
03-21 14:52:36.196: W/VideoView(26612): at android.view.SurfaceView.updateWindow(SurfaceView.java:533)
03-21 14:52:36.196: W/VideoView(26612): at android.view.SurfaceView.access$000(SurfaceView.java:81)
03-21 14:52:36.196: W/VideoView(26612): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)
03-21 14:52:36.196: W/VideoView(26612): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
03-21 14:52:36.196: W/VideoView(26612): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617)
03-21 14:52:36.196: W/VideoView(26612): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
03-21 14:52:36.196: W/VideoView(26612): at android.os.Handler.dispatchMessage(Handler.java:99)
03-21 14:52:36.196: W/VideoView(26612): at android.os.Looper.loop(Looper.java:137)
03-21 14:52:36.196: W/VideoView(26612): at android.app.ActivityThread.main(ActivityThread.java:4424)
03-21 14:52:36.196: W/VideoView(26612): at java.lang.reflect.Method.invokeNative(Native Method)
03-21 14:52:36.196: W/VideoView(26612): at java.lang.reflect.Method.invoke(Method.java:511)
03-21 14:52:36.196: W/VideoView(26612): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-21 14:52:36.196: W/VideoView(26612): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-21 14:52:36.196: W/VideoView(26612): at dalvik.system.NativeStart.main(Native Method)
03-21 14:52:36.196: D/VideoView(26612): Error: 1,0
我正在使用准备好的侦听器来调用 start,如下所示:
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mVideoView.start();
}
});
我这样设置数据源:
file = new File(this.getFilesDir() + File.separator + VIDEO_FILE_NAME);
mVideoView.setVideoPath(file.getAbsolutePath());
我确信该文件确实存在并且格式正确。
我的应用程序能够从警报触发器启动。这似乎只有在设备屏幕关闭时触发器触发并启动我的应用程序时才会出现问题(我的应用程序将通过唤醒锁打开屏幕)。如果我手动启动应用程序,或者触发事件发生在视频屏幕上,则可以正常播放。此错误也仅发生在 Galaxy Nexus 上。我可以在 Nexus S(以及一长串其他代码)上运行完全相同的代码,并且每次都能正常启动。
有谁知道 Galaxy Nexus 或 ICS 的任何特定情况可能导致此行为?对于我可以尝试解决的问题有什么建议吗?
UThis已连接到您的SurfaceView。
确保在 MediaPlayer 上调用准备并且它可见后不要触摸 SurfaceView。如果您尝试唤醒屏幕,请确保一切都按正确的顺序发生。因此,准备 MediaPlayer 进行播放是您的应用程序应该做的最后一件事。可能是在应用程序完全唤醒之前启动准备/播放,导致应用程序尝试操作 SurfaceView。
下面的代码示例说明了如何触发此类异常:
private void setupVideo(String file){
...
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
mHolder = mSurfaceView.getHolder(); // DON'T TOUCH BEHIND THIS POINT
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mMediaPlayer.setDisplay(mHolder);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepare();
}
@Override
public void onPrepared(final MediaPlayer mp) {
mSurfaceView.setVisibility(View.VISIBLE); // THIS WILL CAUSE THE ERROR
mp.start();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)