求助【2.4.12】原生使用Camera截图升级引擎后导致黑屏

  • Creator 版本:
    2.4.12

  • 目标平台:鸿蒙3.0,手机是honor8,夜神模拟器也一样无法使用

    下面这个是代码复现工程:
    NewProject_screenshot.zip (241.2 KB)

  • 重现方式:运行就会直接黑屏

  • 首个报错:

  • 之前哪个版本是正常的: 2.4.9

  • 手机型号: 鸿蒙3.0,手机是honor8

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:2.4.9之前不会,升级引擎后就用不了了

以下是截图的代码,此代码在2.4.9可以正常使用,升级引擎后就无法使用了

start() {

    this.scheduleOnce(() => {

        this.screenshot((spriteFrame) => {

            var canvas = cc.director.getScene().getChildByName('Canvas'),

                node = new cc.Node();

            node.parent = canvas;

            node.zIndex = 1000;

            node.scale = 0.8;

            var sprite = node.addComponent(cc.Sprite);

            sprite.spriteFrame = spriteFrame;

            // next(spriteFrame);

        });

    }, 1)

},

screenshot(next) {

    console.log("进入截图流程!!!!!!!!!!!",)

    var canvas = cc.director.getScene().getChildByName('Canvas'),

        node = new cc.Node();

    node.parent = canvas;

    var camera = node.addComponent(cc.Camera);

    camera.backgroundColor = cc.Color.TRANSPARENT;

    camera.clearFlags = cc.Camera.ClearFlags.DEPTH | cc.Camera.ClearFlags.STENCIL | cc.Camera.ClearFlags.COLOR;

    var renderTexture = new cc.RenderTexture();

    renderTexture.initWithSize(cc.visibleRect.width * 0.5, cc.visibleRect.height * 0.5, cc.game._renderContext.STENCIL_INDEX8);

    camera.targetTexture = renderTexture;

    var spriteFrame = new cc.SpriteFrame();

    if (cc.sys.isNative) {

        console.log("是安卓截图!!!!!!!!!!!!!")

        camera.enabled = true;

        camera.scheduleOnce(() => {

            console.log("------------计时结束-----------------",)

            var data = renderTexture.readPixels();

            var width = renderTexture.width;

            var height = renderTexture.height;

            var picData = new Uint8Array(width * height * 4);

            var rowBytes = width * 4;

            console.log("------------data-----------------")

            for (var row = 0; row < height; row++) {

                var srow = height - 1 - row;

                var start = srow * width * 4;

                var reStart = row * width * 4;

                for (var i = 0; i < rowBytes; i++) {// save the piexls data

                    picData[reStart + i] = data[start + i];

                }

            }

            console.log("------------开始创建Texture2D----------------")

            var texture = new cc.Texture2D();

            console.log("--Texture2D创建成功-----------截图:创建纹理!!!!!!!!!!!");

            texture.initWithData(picData, 32, width, height);

            spriteFrame.setTexture(texture);

            next(spriteFrame);

            camera.targetTexture = null;

            camera.enabled = false;

            node.destroy();

        }, 0);

    } else {

        camera.enabled = false;

        // 执行一次 render,将所渲染的内容渲染到纹理上

        camera.render();// 到这里,截图就已经完成了

        // 接下去,可以从 RenderTexture 中获取数据,进行深加工

        var data = renderTexture.readPixels();

        var width = renderTexture.width;

        var height = renderTexture.height;

        // 接下来就可以对这些数据进行操作了

        var canvas = document.createElement('canvas');

        var ctx = canvas.getContext('2d');

        canvas.width = width;

        canvas.height = height;

        // 1维数组转2维(同时做个上下翻转)

        var rowBytes = width * 4;

        for (var row = 0; row < height; row++) {

            var srow = height - 1 - row;

            var imageData = ctx.createImageData(width, 1);

            var start = srow * width * 4;

            for (var i = 0; i < rowBytes; i++) {

                imageData.data[i] = data[start + i];

            }

            ctx.putImageData(imageData, 0, row);

        }

        var dataUrl = canvas.toDataURL("image/jpeg");

        var img = new Image();

        img.src = dataUrl;

        img.onload = function () {

            var texture = new cc.Texture2D();

            texture.initWithElement(img);

            texture.handleLoadedTexture();

            spriteFrame = new cc.SpriteFrame(texture);

            next(spriteFrame);

        }

    }

}

截图在真机上一运行就黑屏了。

截图后调用render了。逻辑延时一帧也有,但是就是用不了

点我进入 论坛里面这个截图项目也下载下来试过了,同样是升级到2.4.12以后就无法截图了。

不知道是不是安卓新版本的sdk不兼容低版本?