MediaPlayer生成';can';t播放此视频';Android上的错误

MediaPlayer生成';can';t播放此视频';Android上的错误,android,codenameone,Android,Codenameone,我有一个表单,除了播放从服务器下载的视频外,什么也不做。它工作正常,除了在视频播放结束后按下后退按钮(从工具栏或设备后退按钮)时,在上一个窗体显示后,会弹出一个带有消息“无法播放此视频”的本机Android对话框。如果我在播放视频时退出表单,则不会出现错误。我真的很想摆脱这条消息。 这是我的密码: 上一个表单 final Button playVideo = new Button(res.getImage("play-video2.png")); playVideo.addActionListe

我有一个表单,除了播放从服务器下载的视频外,什么也不做。它工作正常,除了在视频播放结束后按下后退按钮(从工具栏或设备后退按钮)时,在上一个窗体显示后,会弹出一个带有消息“无法播放此视频”的本机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();
        }
    }
});
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回调,该回调将在完成后调用。