【发布时间】:2018-03-30 12:02:47
【问题描述】:
我有一个表单,除了播放从服务器下载的视频外,什么都不做。它工作正常,除了在视频播放完毕后按下后退按钮(从工具栏或设备后退按钮)时,在前一个表单之后会弹出一个带有“无法播放此视频”消息的原生 Android 对话框显示。如果我在播放视频时退出表单,我不会出错。我真的很想摆脱这条消息。
这是我的代码:
以前的形式
final Button playVideo = new Button(res.getImage("play-video2.png"));
playVideo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
try {
new VideoPlayerForm(getComponentForm(), (String) fileInfo.get("path")).show();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
VideoPlayerForm
public VideoPlayerForm(Form instance, String videoUrl) throws IOException {
super(instance);
setLayout(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_SCALE));
setTitle(MyApplication.getInstance().getString("video"));
String filepath = FileSystemStorage.getInstance().getAppHomePath() + MyApplication.DIRECTORY_APP_DOWNLOADS + "/" + videoUrl;
try{
if(!FileSystemStorage.getInstance().exists(filepath)){
Log.p("Downloading " + videoUrl + " to local storage");
success = Cn1FileUtils.downloadRemoteFile("https://medonline.co.il/uploads/" + videoUrl, videoUrl, true);
if(!success){
UniversalToast.show(MyApplication.getInstance().getString("error_video_download_failed"), UniversalToast.LENGTH_SHORT);
return;
}
}
final InputStream is = FileSystemStorage.getInstance().openInputStream(filepath);
video = MediaManager.createMedia(is, "video/mp4");
}catch(Exception e){
new DownloadedFileBrowserForm(this).show();
return;
}
add(BorderLayout.CENTER, new MediaPlayer(video));
}
@Override
protected void onShowCompleted() {
super.onShowCompleted();
if(!success){
previousInstance.showBack();
}
else{
video.setFullScreen(true);
video.play();
}
}
}
Android 堆栈跟踪
03-29 14:03:25.563 11427 11427 W VideoView: Unable to open content: file:///data/user/0/il.co.medonline.doctorapp/cache/mtmp-257887399
03-29 14:03:25.563 11427 11427 W VideoView: java.io.IOException: setDataSource failed.
03-29 14:03:25.563 11427 11427 W VideoView: at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1095)
03-29 14:03:25.563 11427 11427 W VideoView: at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1041)
03-29 14:03:25.563 11427 11427 W VideoView: at android.media.MediaPlayer.setDataSource(MediaPlayer.java:987)
03-29 14:03:25.563 11427 11427 W VideoView: at android.widget.VideoView.openVideo(VideoView.java:346)
03-29 14:03:25.563 11427 11427 W VideoView: at android.widget.VideoView.access$2100(VideoView.java:70)
03-29 14:03:25.563 11427 11427 W VideoView: at android.widget.VideoView$7.surfaceCreated(VideoView.java:622)
03-29 14:03:25.563 11427 11427 W VideoView: at android.view.SurfaceView.updateWindow(SurfaceView.java:597)
03-29 14:03:25.563 11427 11427 W VideoView: at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:179)
03-29 14:03:25.563 11427 11427 W VideoView: at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
03-29 14:03:25.563 11427 11427 W VideoView: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2055)
03-29 14:03:25.563 11427 11427 W VideoView: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
03-29 14:03:25.563 11427 11427 W VideoView: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
【问题讨论】:
-
在离开活动之前,您应该在活动或片段的 onStop 方法中停止并释放媒体播放器。
-
@chetanprajapat 这是一个代号项目,只有一个活动
-
尝试: - 在工具栏的后退按钮中添加相同的内容,或者您应该在视频完成后释放播放器。
-
我实际上已经尝试在后面的命令中执行
video.cleanup(),但它没有帮助。有没有办法在视频完成时触发回调? -
如果您使用媒体播放器,则媒体播放器有 onCompletionListener 回调,将在完成后调用。
标签: android codenameone