Codename One WebBrowser从FileSystemStorage加载HTML

时间:2015-06-12 11:26:33

标签: html codenameone base-url

我正在使用Codename开发一个应用程序,用于离线查看报告,该报告采用HTML格式,资源包含在单独的文件夹中。应用程序下载HTML并复制资源的文件夹结构,因为它们是HTML中的引用。当我使用普通浏览器打开报告并将其指向" /。cn1"加载并正确显示的文件夹。使用模拟器时,HTML被加载到Codename One Web Browser对象中并显示(我可以看到报告的标题),只是Web浏览器没有加载任何资源。我还将基本URL设置为该文件夹。

    WebBrowser wbBrowser = (WebBrowser) findByName("WebBrowser",  f);
    FileSystemStorage fs = FileSystemStorage.getInstance();
    wbBrowser.setPage(getTextFromFile(fs.getAppHomePath() + "/Reports/Report_2.html"), fs.getAppHomePath() + "/Reports/Report_2_files_files");

这是我目前正在使用的代码。在显示Report Viewer表单后运行。我已经在Android Lollipop中打开了默认浏览器和Mozilla Firefox Android应用程序的报告,它正确显示了所有图像和CSS的网页,因此我不确定它是否是代号一个安全问题。任何想法都将不胜感激。

编辑:我试图简化应用程序,我只是运行以下代码;

        WebBrowser wbBrowser = (WebBrowser) findByName("WebBrowser", Display.getInstance().getCurrent());
        FileSystemStorage fs = FileSystemStorage.getInstance();
        fs.mkdir(fs.getAppHomePath() + "[Folder Name]");
        Util.downloadUrlToFile("http://[IpAddress]/mobile/admin/Report_2.html", fs.getAppHomePath() + "[Folder Name]/Report_2.html", true);
        if (FileSystemStorage.getInstance().exists(fs.getAppHomePath() + "[Folder Name]/Report_2.html") == true) {
            wbBrowser.setURL(fs.getAppHomePath() + "[Folder Name]/Report_2.html");
            Dialog.show("Success", "File has been downloaded and shown as " + wbBrowser.getTitle(), "Ok", "");
        } 
        else {
            Dialog.show("Failiure", "File has not been downloaded", "Ok", "");
        }

在Android Lollipop设备上运行时,显示成功对话框,尽管在设备上运行搜索时我没有找到它们(我不知道存储一个商店文件的代号)。没有其他代码在设备上的任何地方运行,但是当我自己将HTML文档存储在设备上并使用硬编码引用(即/Storage/emulated/0/Android/data/Report_2.html)时,我已经取得了成功。 wbBrowser.getTitle()为null /""在设备上运行时。虽然当这行代码在其他地方时,它变成了:page。 Report_2.html的HTML是;

<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <h1>Hello World</h1>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

几天之后,我意识到setURL()需要file://pathname格式的路径,我使用的是/pathname,而setURL()无法使用setPage()但是当我从文件中读取HTML时,却在.state('app.login', { url: "/login", views: { 'menuLogin': { templateUrl: "templates/login.html", controller: 'LoginCtrl' } } }) .state('app.signup', { url: '/signup', views: { 'menuSingup': { templateUrl: 'templates/signup.html', controller: 'LoginCtrl' } } }) 上做了。这是用户错误。

答案 1 :(得分:0)

这应该可以在设备上使用,但可能在模拟器上指向错误。

它应该在模拟器中指向的路径是file://home/appName/,它应该可以正常工作。我建议将URL设置为文件而不是设置HTML,这样可以轻松添加图像,css文件等,更不用说它可能会更快。