android上videoPlayer的bug

打开源代码jsb-videoplayer.js,定位到如下代码:

_p.play = function () {
    let video = this._video;
    if (!video || !this._visible || this._playing) return;

    video.play();
    this._playing = true;
};

可以明显看到调用video.play()的时候先判断_playing的值,之后强制将_playing置为true了,再看看Cocos2dxVideoView.java这个源代码,定位到如下代码:

public void start() {
    if ((mCurrentState == State.PREPARED ||
            mCurrentState == State.PAUSED ||
            mCurrentState == State.PLAYBACK_COMPLETED) &&
            mMediaPlayer != null) {

        mCurrentState = State.STARTED;
        mMediaPlayer.start();
        this.sendEvent(EVENT_PLAYING);
    }
}

从这里可以看到是否真的开启了播放是有条件判断的,所以这里就会产生了一个问题,当不在该条件里的时候在js层调用了play(),并没有开启播放,但_playing已经是true了,但下次真的可以播放的时候再调用pla(),却无济于事了,直接在js层就被拦截了

两个的判断条件是有一定的关联性,但是还是要看具体是遇到什么问题了?怎么复现的,可否提供个demo,我们排查下~

就是很简单,在android上,在没收到ready-to-play之前调用过play(),等再收到ready-to-play的时候无法播放了

调用play是会直接设置playing状态,正确方式是在回调里面去做播放处理,相见example-case。

这难道不是源码处理上有问题吗?即使开发者在不当的时候调用了一个无效的函数,但也不能影响后面的操作啊

已经处理,可以同步下个PR试试 :11:
https://github.com/cocos-creator-packages/jsb-adapter/pull/316

还有另一个问题,android上视频全屏状态下使用back键返回非全屏,js层的isFullscreen属性依然返回true;发布成web-mobile形式在ios浏览器上在ready-to-play状态下没有预览图

后面俩问题不管了么

不管了么?