MediaPlayer生成';can';t播放此视频';Android上的错误
我有一个表单,除了播放从服务器下载的视频外,什么也不做。它工作正常,除了在视频播放结束后按下后退按钮(从工具栏或设备后退按钮)时,在上一个窗体显示后,会弹出一个带有消息“无法播放此视频”的本机Android对话框。如果我在播放视频时退出表单,则不会出现错误。我真的很想摆脱这条消息。MediaPlayer生成';can';t播放此视频';Android上的错误,android,codenameone,Android,Codenameone,我有一个表单,除了播放从服务器下载的视频外,什么也不做。它工作正常,除了在视频播放结束后按下后退按钮(从工具栏或设备后退按钮)时,在上一个窗体显示后,会弹出一个带有消息“无法播放此视频”的本机Android对话框。如果我在播放视频时退出表单,则不会出现错误。我真的很想摆脱这条消息。 这是我的密码: 上一个表单 final Button playVideo = new Button(res.getImage("play-video2.png")); playVideo.addActionListe
这是我的密码: 上一个表单
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();
}
}
});
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();
}
}
}
VideoPlayPerform
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();
}
}
});
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 stacktrace
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)
我认为全屏查看器错误地返回到您的父窗体而不是实际的返回窗体(因为全屏模式),并且由于
onShowComplete
方法运行了两次,因此再次触发启动代码
视频结束时,您可以使用以下语法获取事件:
video = MediaManager.createMedia(is, "video/mp4", () -> {
video = null;
parentForm.show();
});
在离开活动之前,您应该停止并在活动或片段的顶部方法中释放媒体播放器。@chetanprajapat这是一个codenameone项目,只有一个activitytry:-在工具栏的“后退”按钮中添加相同的内容,或者您应该在视频完成后释放播放器。实际上我已经尝试过做
video.cleanup()
在back命令中,但它没有帮助。是否有方法在视频完成时触发回调?如果您使用media player,则media player具有onCompletionListener回调,该回调将在完成后调用。