【问题标题】:MediaPlayer generates 'can't play this video' error on AndroidMediaPlayer 在 Android 上生成“无法播放此视频”错误
【发布时间】: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


【解决方案1】:

我认为全屏查看器错误地返回到您的父窗体而不是实际返回窗体(因为全屏模式)并且由于 onShowComplete 方法运行两次而再次触发启动代码。

您可以在视频结束时使用以下语法获取事件:

video = MediaManager.createMedia(is, "video/mp4", () -> {
     video = null;
     parentForm.show();
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多