MediaPlayer 在 HLS 流结束时在 Android 上生成 "can't play this video" 错误

MediaPlayer generates "can't play this video" error on Android at the end of an HLS streaming

读者注意:此问题仅针对代号一,请不要post回答与Android工作室相关的问题。

这个问题在这里已经有了答案: 但是这个答案不适用于我的代码,因为我无法下载直播,我只能在开始 MediaPlayer.

之前检查它是否存在

在流式传输结束时,由以下代码中使用的 MediaManager“完成处理程序”检测到,Android 生成烦人的对话框“无法播放此视频”。它不会一直发生,但经常发生。我的问题是如何避免弹出消息。我知道存在防止显示该错误的 hack,但它涉及本机代码:

我的代码(已经post问题CN.setScreenSaverEnabled(false); and MediaPlayer,注意videoUrl是一个HLS直播:

    private void playVideo(Form parent, String videoUrl) {
        CN.setScreenSaverEnabled(false);
        Form player = new Form(new BorderLayout());
        player.getToolbar().setBackCommand("Back", Toolbar.BackCommandPolicy.ALWAYS, e -> {
            if (mp != null) {
                mp.getMedia().cleanup();
            }
            CN.setScreenSaverEnabled(true);
            parent.showBack();
        });
        player.add(BorderLayout.CENTER, FlowLayout.encloseCenterMiddle(
                new SpanLabel("Stream will start playing automatically when it is live")));

        player.addShowListener(l -> {
            while (!Util.downloadUrlToStorage(videoUrl, "temp.m3u8", false)) {
                CN.invokeAndBlock(() -> Util.sleep(1000));
            }
            try {
                // note that we cannot play the locally downloaded m3u8
                Media video = MediaManager.createMedia(videoUrl, true, () -> {
                    // completion handler, it's invoked when the stream connection is lost
                    if (mp != null) {
                        mp.getMedia().cleanup();
                    }
                    CN.setScreenSaverEnabled(true);
                    parent.showBack();
                });
                video.setNativePlayerMode(false);
                if (mp != null) {
                    mp.getMedia().cleanup();
                }
                mp = new MediaPlayer(video);
                mp.setAutoplay(true);
                mp.setHideNativeVideoControls(true);
                mp.setMaximize(false);
                player.removeAll();
                player.add(BorderLayout.CENTER, mp);
                player.revalidate();
            } catch (Exception err) {
                Log.e(err);
                ToastBar.showErrorMessage("Error loading straming");
            }
        });

        player.show();
    }

我们也将针对此事件处理程序将我们的本机实现更改为 return true,因此我们也将获取该事件。我想不出用户会想要在此处查看本机 android 对话框以进行媒体播放的情况。