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