无法在Windows 8.1平台上使用cordova inappbrowser打开本地文件

时间:2016-01-12 19:07:18

标签: windows-8.1 phonegap-plugins inappbrowser cordova-5.0.0

我正在开发一个手机间隙应用程序,我们最近添加了对Windows 8.1平台的支持。应用程序使用Cordova FileSystem API下载/创建保存到设备的文件。

我已使用类似

的网址成功将文件保存到设备

ms-appdata:///local/file.png

我已经检查了我的电脑,该文件可以在应用程序根文件夹下的LocalState文件夹中查看。但是,当我尝试使用inAppBrowser打开此文件时,没有任何反应;没有报告任何错误消息,并且没有任何inAppBrowser默认事件触发。

function empty() { alert('here'); } //never fires
var absoluteUrl = "ms-appdata:///local/file.png";
cordova.InAppBrowser.open(absoluteURL, "_blank", "location=no", { loadstart: empty, loadstop: empty, loaderror: empty });

我已通过在网址

上调用以下内置javascript来验证网址是否有效
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done(function (file) {
                debugger; //the file object contains the correct path to the file; C:\...etc.
            });

另外,添加url作为img标记的src可以正常工作。

我还尝试使用addEventListener(“loadstart”)等连接inAppBrowser处理程序,但它们都没有触发。但是,当我尝试打开“http://www.google.com”时,事件会触发,并且屏幕上会弹出inAppBrowser。

在检查dom后,我可以看到已经添加了inAppBrowser元素,但它似乎没有设置源属性

<div class="inAppBrowserWrap">
    <x-ms-webview style="border-width: 0px; width: 100%; height: 100%;"></x-ms-webview>
</div>

我已经查看了其他问题,例如this one,但无济于事。我已经验证了

a)已安装InAppBrowser

b)deviceReady已解雇

我也尝试将目标更改为“_self”(同一问题)和“_system”(弹出窗口说你需要一个新的应用来打开msappdata://类型的文件)而且我的想法已经用完了。有没有人遇到过类似的问题?

2 个答案:

答案 0 :(得分:3)

我有类似的问题。我的cordova应用程序下载文件,然后使用本机浏览器打开(以便正确处理图像,PDF文件等)。

最后,我不得不修改InAppBrowserProxy.js类(Windows平台的InAppBrowser插件的一部分)。

这是打开文件的代码(纯JavaScript):

// This value comes from somewhere, I write it here as an example
var path = 'ms-appdata:///local//myfile.jpg';

// Open file in InAppBrowser
window.open(path, '_system', 'location=no');

然后,我更新了InAppBrowserProxy.js文件(在platforms\windows\www\plugins\cordova-plugin-inappbrowser\src\windows下)。我替换了这段代码:

if (target === "_system") {
    url = new Windows.Foundation.Uri(strUrl);
    Windows.System.Launcher.launchUriAsync(url);
}

由此:

if (target === "_system") {
    if (strUrl.indexOf('ms-appdata:///local//') == 0) {
        var fileName = decodeURI(strUrl.substr(String(strUrl).lastIndexOf("/") + 1));
        var localFolder = Windows.Storage.ApplicationData.current.localFolder;

        localFolder.getFileAsync(fileName).then(function (file) {
            Windows.System.Launcher.launchFileAsync(file);
        }, function (error) {
            console.log("Error getting file '" + fileName + "': " + error);
        });
    } else {
        url = new Windows.Foundation.Uri(strUrl);
        Windows.System.Launcher.launchUriAsync(url);
    }
}

这是一个非常特别的黑客,但它为我做了诀窍,它可以改进,扩展,甚至标准化。

无论如何,可能还有其他方法可以达到这个目的,只是这对我有用......

答案 1 :(得分:1)

经过更多搜索后,似乎x-ms-webview(PhoneGap for Windows使用的底层组件)仅支持加载HTML内容。 Web视图控件上的此Microsoft blog post表明

  

UnviewableContentIdentified - 在用户导航到时触发   网页以外的内容。 WebView控件只能使用   显示HTML内容。它不支持独立显示   图像,下载文件,查看Office文档等。此事件   被激活,以便应用程序可以决定如何处理这种情况。

article建议查看Windows.Data.Pdf命名空间,以便为阅读PDF提供应用内支持。