【问题标题】:Codename One WebBrowser loading HTML from FileSystemStorageCodename One WebBrowser 从 FileSystemStorage 加载 HTML
【发布时间】:2015-08-28 09:29:34
【问题描述】:

我正在开发一个代号为 one 的应用程序,用于离线查看报告,该报告采用 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");

这是我目前使用的代码。在显示报告查看器表单后运行。我已经在 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/""。尽管当这行代码在其他地方时,它变成了 about:page。 Report_2.html 的 HTML 是;

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

【问题讨论】:

  • 您的 HTML 文件似乎无效并且缺少 html 标签。众所周知,移动浏览器对有效的 html 很敏感...
  • 抱歉,这是从文件中手动复制的。真实文件有效。我已经编辑了答案以反映这一点。
  • 当你写[Folder Name]时,你并没有真正使用[Folder Name],对吧?您使用的是纯字母数字的有效名称,对吗?
  • 不,[Folder Name] 只是真实文件夹名称的占位符,是一个没有特殊字符的字母数字公司名称。

标签: html codenameone base-url


【解决方案1】:

几天后,我意识到setURL() 需要file://pathname 格式的路径,我使用的是/pathname,它在setURL() 上不起作用,但在我阅读时对setPage() 起作用文件中的 HTML。这是一个用户错误。

【讨论】:

    【解决方案2】:

    这应该可以在设备上运行,但在模拟器上可能会错误地指向。

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

    【讨论】:

    • 嗨@Shai,感谢您的回复。我今天一直在开发应用程序,发现模拟器在使用 fs.getAppHomePath() 时指向“file://home/”而不是“file://home/[appName]”,但它正在存储并正确读取 HTML 文件。尽管路径相同,但 setURL() 并没有在模拟器上显示任何有趣的东西。
    • ...当应用程序在 Android 设备上运行时,它指向它的路径 /data/data/[com.myCompany.myApp] 这不是路径存在于设备上。因此,当我尝试从设备读取文件时,我遇到了 I/O 错误,所以我认为你是正确的,这是一个文件路径错误。要补充的是,我正在使用Util.downloadUrlToFile(serverFile, phoneFile, true); 下载文件,其中phoneFile 路径是使用getAppHomePath() 函数设置的。
    • 您应该始终使用getAppHome 方法来构造路径并有效地忽略 URL 的外观。
    • 我已经在@Shai 上采纳了您的建议,并坚持使用 getAppHome() 函数,但在硬编码时,我能够使用图像/CSS 来查看报告。我的问题已更新以显示我的努力。在新应用程序中,webBrowser 显示一个空白页面。测试设备是带有 SD 卡的 LG G3。我能问一下为什么我在文件资源管理器中看不到路径,即使exists() 说它存在,这是多平台问题吗?
    • 显示成功对话框,但您在屏幕上看不到 hello world?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多