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

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

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

我已使用如下所示的 URL 成功将文件保存到设备

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 });

我已通过在 url 上调用以下内置 JavaScript 来验证该 url 是否有效

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://类型的文件),但我已经没有主意了。有人遇到过类似的问题吗?

最佳答案

我也遇到了类似的问题。我的 cordova 应用下载文件,然后使用 native 浏览器打开它(以便正确处理图像、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);
    }
}

这是一个非常临时的黑客,但它对我有用,并且可以改进、扩展,甚至标准化。

无论如何,可能还有其他方法可以实现这一目标,只是这对我有用......

关于windows-8.1 - 无法在Windows 8.1平台上使用cordova inappbrowser打开本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751851/

相关文章:

javascript - 使用代码中的模板实例化 WinJS.UI.ListView 时出错

error-handling - 防止WinJS应用程序在文件调用失败时崩溃

phonegap-plugins - PhoneGap 插件中的 ^ 规范属性是什么意思?

file - 无法在 Phonegap 中使用 inappbrowser 下载文件?

angularjs - ios和黑莓中的Cordova inAppBrowser插件问题

c++ - Win10 上的 Win8 应用程序崩溃(D3D11CreateDevice 返回 null)

powershell - 无法在 Windows 8.1 上更改 PowerShell 字体和窗口大小

java - 访问 Phonegap 插件中 UI 线程上运行的对话框

android - 如何使用 PhoneGap Build 获取设备区域设置或语言?

ios - Cordova InAppBrowser 立即关闭 iOS 13