Codenameone 当视频刚刚加载或暂停时,它们是完全黑色的(在Android上)

Codenameone 当视频刚刚加载或暂停时,它们是完全黑色的(在Android上),codenameone,Codenameone,这种情况只在Android上发生。视频在iOS和模拟器上正常工作 问题是,当我的视频加载到MediaPlayer中时,显示的帧是并保持完全黑色。按“播放”后,视频将正确显示。按pause可正确显示发生暂停的帧。但是,如果应用程序切换到背景,然后再切换回前景,暂停的视频将恢复为完全黑色 我如何解决这个问题 我的代码的相关部分大致如下: Media video = MediaManager.createMedia(videoFilePath, true, () -> {

这种情况只在Android上发生。视频在iOS和模拟器上正常工作

问题是,当我的视频加载到MediaPlayer中时,显示的帧是并保持完全黑色。按“播放”后,视频将正确显示。按pause可正确显示发生暂停的帧。但是,如果应用程序切换到背景,然后再切换回前景,暂停的视频将恢复为完全黑色

我如何解决这个问题

我的代码的相关部分大致如下:

        Media video = MediaManager.createMedia(videoFilePath, true, () -> {
            Runnable callback = runOnVideoCompletion.get();
            if (callback != null) {
                callback.run();
            }
        });
        video.setNativePlayerMode(false);
        video.prepare();
        MediaPlayer mediaPlayer = new MediaPlayer(video) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(size, size);
            }
        };
        mediaPlayer.setHideNativeVideoControls(true);
        mediaPlayer.setMaximize(false);
        mediaPlayer.hideControls();
        mediaPlayer.setAutoplay(false);

        Container mediaPlayerCnt = new Container(new LayeredLayout(), "NoMarginNoPadding") {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(size, size);
            }
        };
        mediaPlayerCnt.add(mediaPlayer);

        [...]

更新:请查看评论,因为有一种方法比我在这里提出的解决方案更好


在等待一个合适的解决方案时,我想出了一个解决办法,似乎可以在我的Android手机上完美地解决这个问题

此代码位于一个被调用以创建每个视频的方法中,因此在
form.show()
之前执行,因此在显示表单大约半秒钟后调用UITimer runnable

        /*
         * Workaround for the issue: https://stackoverflow.com/q/66144759
         * "video" is a Media instance returned by MediaManager.createMedia
         * This workaround is for Android only and it assumes we don't use autoplay
         */
        if (form != null && DeviceUtilities.isAndroidNative()) {
            UITimer.timer(500, false, form, () -> {
                CN.invokeAndBlock(() -> {
                    video.play();
                    video.setVolume(0);
                    while (!video.isPlaying()) {
                        /*
                         * When in a scrollable container there are many videos,
                         * play does not start immediately, but only when the
                         * video becomes visible, so we must wait.
                         */
                        Util.sleep(100);
                    }
                    Util.sleep(100); // extra wait to be sure that the waiting is not zero
                    video.pause();
                    video.setVolume(100);
                });
                form.addShowListener(l -> {
                    CN.invokeAndBlock(() -> {
                        video.play();
                        video.setVolume(0);
                        while (!video.isPlaying()) {
                            // same as above
                            Util.sleep(100);
                        }
                        Util.sleep(100); // as above
                        video.pause();
                        video.setVolume(100);
                    });
                });
            });
        }

这可能是我们可以在端口中解决的行为,我们必须考虑一下。这似乎是一个常见的Android问题,如果可能的话,可能值得将该解决方案集成到代号1中。知道了,我在Github上添加了该问题:我找到了一个解决方案,请查看我的答案:)