2016-01-12 77 views
3

我正在開發手機間隙應用程序,最近我們添加了對Windows 8.1平臺的支持。應用程序使用Cordova FileSystem API下載/創建保存到設備的文件。無法在Windows 8.1平臺上使用cordova inappbrowser打開本地文件

我一直在使用它看起來像這樣

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

我檢查我的電腦上的文件是應用程序的根文件夾下的LocalState文件夾中查看的URL成功保存文件到設備。但是,當我嘗試使用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作爲的src img標籤按預期工作。

我也嘗試使用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但沒有其他問題無濟於事。我已經驗證了

一)InAppBrowser安裝

B)deviceReady已經解僱

我也試圖改變目標爲「_self」(同樣的問題)和「_SYSTEM」(彈出說你需要一個新的應用程序來打開一個msappdata類型的文件://),我的想法已經不多了。有人遇到過類似的問題嗎?

回答

1

經過更多搜索後,似乎PhoneGap for Windows使用的基礎組件x-ms-webview僅支持加載HTML內容。此Microsoft blog post上的Web視圖控件指出

UnviewableContentIdentified - 是當用戶瀏覽到一個比其他網頁內容 解僱。 WebView控件僅能夠顯示HTML內容 。它不支持顯示獨立的 圖像,下載文件,查看Office文檔等。此事件 已被解僱,因此應用可以決定如何處理這種情況。

article建議看Windows.Data.Pdf命名空間用於讀取PDF文件提供應用程序內的支持。

3

我有類似的問題。我的科爾多瓦應用程序下載文件,然後用本機瀏覽器打開它(以便正確處理圖像,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

是在@Jack奧尼爾的回答中提到的相同的博客文章,說:'Windows.System。 Launcher.LaunchFileAsync()可以被調用,以便shell確定正確的應用程序來處理文件。「這對我有效 – shadi

相關問題