来自 ms-appdata:///local 的 img 未使用 Winjs/cordova 显示

img from ms-appdata:///local not showing using Winjs/cordova

本文关键字:Winjs 未使用 cordova 显示 img ms-appdata local 来自      更新时间:2023-09-26

我正在使用Visual Studio和cordova工具构建一个小应用程序。该应用程序显示一系列问题,在每个问题上,用户可以拍摄多张照片并在其中绘制。

该应用程序的目标是Windows 8.1,但将来将针对Android,所以我尽量不使用本机Windows功能。

在应用程序中有一个叠加层,用户可以在其中使用cordova插件相机拍照。然后,拍摄的照片显示在 img 元素中,然后将其复制到要绘制的画布元素中,当用户将照片(与用户绘图一起)保存到 ms-appdata://local/XXX.png 时。图像已正确保存,我已经在文件系统上检查了它,它就在那里并且是一个有效的 png 文件。

这是我用来编写的代码,使用 cordova-plugin-file (v 4.1.1-dev) 将图像转换为文件:

window.resolveLocalFileSystemURL(store, function (dir) {
                console.log("got main dir", dir);
                //gravar imagem para ficheiro          
                dir.getFile(fileAnotacao, { create: true }, function (file) {
                    console.log("got the file", file);
                    setTimeout(function () {
                        if (apagou) { //apagou a referencia, criar nova e criar ficheiro
                            dir.getFile(fileAnotacao, { create: true }, function (file) {
                                writeLog(decodedData, file);
                            });
                        } else
                            //grava ficheiro
                            writeLog(decodedData, file);
                    }, 1500);
                    //1º apaga ficheiro se existir
                    file.remove(function () {
                        console.log('File removed.');
                        apagou = true;
                    }, fail);
                });
            });

写日志函数是这样的:

 function writeLog(str, lob) {
    if (!lob) return;
    lob.createWriter(function (fileWriter) {
        fileWriter.seek(fileWriter.length);
        fileWriter.write(str);
        console.log("ok, in theory i worked");
    }, fail);
}

将文件保存到磁盘后,我使用两个文件的路径更新命名空间。原版名为"原件",绘制的名为"anotacao"。

之后,我使用连接到 Winjs Flipview 组件的文件名更新第二个命名空间。我使用第二个命名空间,因为我只想显示原始命名空间子部分的图像,即来自一个问题的图像。

function AtualizarFotos() {
    var id = document.getElementById("id_val_foto").innerHTML;
    //atualizar namespaces com as fotos
    var idq = id.split("_");
    //quest is used to fectch the correct question, so it knows what photos to show
    var quest = GetPergunta(idq[1]);
    if (quest) {
        if (FotosNP.ftList) {
            FotosNP.ftList.splice(0, FotosNP.ftList.length);
            quest.Fotos.forEach(function additem(value, index, array) {
                FotosNP.ftList.push(value);
            });
     //updates a counter
            document.getElementById("contaFotos").innerHTML = FotosNP.ftList.length;
        }
    }

在HTML中,我有一个模板和一个连接到FotosNP命名空间的fliview。如果将"原始"放在绑定字段中,则翻转视图可以正常工作。如果我将"anotacao"放在绑定字段中,即使我关闭并打开叠加层,也不会加载图像。

两张照片都保存到同一个文件夹:ms-appdata:///local/。

我已经使用 DOM 检查器检查了 HTML,并且 src 属性是正确的。我尝试使用 Javascript 控制台并在图像标签上显示绘制的照片,但它也没有显示。

我尝试在更新 Flipview 命名空间之前设置超时,因为我坚持认为这可能是写入磁盘的某种延迟。

我尝试了不同的组件,并且还使用了普通的img元素,但它不显示照片。

照片未显示错误

如果我关闭并再次运行应用程序,并用照片加载保存的问题,则照片会正确显示。

我在文件写入上做错了什么?请帮忙。

经过几天的工作,最后寻求一些帮助,我发现这确实是由写入功能引起的延迟。

我解决了将命名空间更新放在文件写入程序的 onwriteend 事件上的问题。

fileWriter.onwriteend= function (evt){
    console.log("ok, in theory i worked");
    quest.Fotos.push({ 
        id: idFoto, 
        original: app.lastCapture, 
        anotacao: store + fileAnotacao 
    });
    AtualizarFotos();
}

我已经尝试设置超时,但时间一定不够。有了这个,我得到了一些滞后,但至少它可以工作。