gpt4 book ai didi

javascript - 从文件 :///to content://(xapk/obb) on Android Cordova 移动内容后 Canvas.toDataURL() 会导致纯黑色

转载 作者:行者123 更新时间:2023-11-28 06:34:21 27 4
gpt4 key购买 nike

我在 Cordova 5.4.1 中使用以下插件:

  • 白名单插件
  • XAPKReader

index.html header 包含此 CSP 元标记(必须丑化 google TalkBack URL):

<meta http-equiv="Content-Security-Policy" 
content="default-src 'self' 'unsafe-inline' 'unsafe-eval'
data: gap: content: cdvfile: ....google-URLS...;
img-src data: gap: file: content: cdvfile: ....google-URLS...;
style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';
connect-src 'self' ....google-URLS..." />

config.xml 包括:

<allow-navigation href="http://*/*" />
<access origin="*://*" />
<allow-intent href="content://*" />
<allow-intent href="content://*/*/*/*" />

当 Canvas 显示带有 file:///* URL 的图像,而不是像 content:///* 这样的 URL 时,我的 Canvas 相关代码看起来像这样并且工作正常

html2canvas($("#layerA"), {onrendered:function(stageCanvas){
var stageCtx = stageCanvas.getContext('2d');
var tmpCanvas = document.createElement('canvas');
tmpCanvas.width = stageCanvas.width;
tmpCanvas.height = stageCanvas.height;
var tmpCtx = stageCanvas.getContext('2d');
var imgObj = new Image();
imgObj.onload = function(){
var destX = 0;
var destY = 0;

tmpCtx.drawImage(imgObj,
sourceX, sourceY, sourceWidth, sourceHeight,
0, 0, destWidth, destHeight);
var data = tmpCtx.getImageData(sourceX, sourceY, sourceWidth, sourceHeight);

stageCtx.clearRect(0, 0, stageCanvas.width, stageCanvas.height); //clear originalCanvas
stageCanvas.width = sourceWidth;
stageCanvas.height = sourceHeight;

tmpCtx.putImageData(data,0,0);
var datauri = null;
try {
datauri = stageCanvas.toDataURL('image/png');
} catch(err) {
alert(err);
}

// store the image and update UI
$('#fav-img-'+maxFavUsed.toString()).attr('src', datauri);
$("#fav-del-"+maxFavUsed.toString()).show();
$('#fav-big').attr('src', datauri);

if(typeof(Storage) !== "undefined") {
localStorage.setItem('fav-img-'+maxFavUsed.toString(), datauri);
}

showFav(maxFavUsed);
showUI();

//clear memory!!!
stageCtx.clearRect(0, 0, sourceWidth, sourceHeight);//clear originalCanvas
tmpCtx.clearRect(0, 0, sourceWidth, sourceHeight);//clear tmpCanvas
data = null;
datauri = null;
tmpCanvas = null;
stageCanvas = null;
imgObj = null;
};
try {
imgObj.src = tmpCanvas.toDataURL("image/png");
} catch(err) {
alert(err);
}
}, width:canvasW, height:canvasH } );

上面的代码不会抛出异常,也不会发出警报,但会创建空的 datauri,因此我认为 Canvas 受到了 CORS 问题的污染。以 content://开头的 URL 由 XAPKReader 插件附带的 java 类 ContentProvider 提供服务。

最佳答案

我自己找到了方法。看起来 Android 上的 Canvas 绘图并不关心 CSP 元条目和白名单插件。因此,在调用上述代码之前,我使用 XMLHttpRequest().readAsDataURL() 来替换 background-image url 中的图像引用通过他们的 dataURI。因此,我还必须将我的 ContentProvider 权限 content://FOO:* 添加到 CSP 元标记的 connect-src: 部分。然后 Canvas 会正确渲染。

关于javascript - 从文件 :///to content://(xapk/obb) on Android Cordova 移动内容后 Canvas.toDataURL() 会导致纯黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34419557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com