Android SL4A:如何链接到 HTML/javascript 应用程序中的相关脚本?
Posted
技术标签:
【中文标题】Android SL4A:如何链接到 HTML/javascript 应用程序中的相关脚本?【英文标题】:Android SL4A: how to link to relative scripts in HTML/javascript app? 【发布时间】:2011-12-28 05:19:16 【问题描述】:好的,所以我尝试了三种方法来将外部 javascript 和 CSS 文件添加到我的 SL4A 应用程序中。我在来自 3UK 的 ZTE Racer 上使用 2.3 Gingerbread(带有谷歌应用程序的 cyanogenmod),并使用 SL4A r4 和 android python 2.6.2(在适当的情况下)。
首先,我假设相对链接会起作用:
<!-- GUI.html - loaded directly within SL4A UI. -->
<script type="text/javascript" src="jquery.js"></script>
情况并非如此 - 未加载相关脚本和样式。
接下来,我尝试使用事件从 python 加载脚本传入绝对路径:
# script.py - launched in order to load window.
import android, sys, time
droid = android.Android()
path = "file://" + sys.path[0]
droid.webViewShow(path + "/GUI.html")
droid.eventPost('globalAppPath', path + "/")
# sleep for a bit to allow webview to load the DOM and read the event.
time.sleep(10)
以及GUI.html
中body标签末尾的内联脚本中的以下代码:
// (inlined jquery to be able to append to a debug div easily.)
var droid = new Android();
var event = droid.eventWait('globalAppPath');
$('#loading').append("<br/>" + JSON.stringify(event));
但是,这会失败,因为该事件没有“结果”属性,只有一个“错误”属性(一些 Java 异常:
org.json.JSONException: Value globalAppPath at 0 of type java.lang.String cannot be converted to int
来自 python 的路径字符串不能转换为未装箱的 int
?!)。
最后,我尝试按照this question 使用document.URL
,如下所示:
// (inlined jquery to be able to append to a debug div easily.)
$('#loading').append("<br/>" + document.URL);
但是,这只是返回路径:
file:///mnt/sdcard/sl4a/scripts/
实际上应该是正确的路径
file:///mnt/sdcard/sl4a/scripts/run-app/GUI.html
有可能是这个不正确的路径首先导致了失败 - 如果相关脚本正在查找可以解释事情的父目录。但是,当以 APK 形式分发给不同制造商的 android 实现时,这显然是不可靠的——我不能依赖关于 SL4A 初始化 Web 视图 URL 路径的方式的任何假设——我更喜欢使用更动态和正确的 python sys.path[0]
,如果我能以某种方式将结果传达给 webview 就好了!
我认为这些失败中的每一个都是一个错误,但所有三个一起只是令人沮丧!我更愿意使用这个框架而不是回到 Titanium,因为它让我有能力在遇到困难并且你不希望你的 javascript UI 冻结时掉入 python,但是如果我不能构建我的代码放到不同的文件中我将很难利用 SL4A 电话编辑功能和每个代码文件中的内联 jquery...
有没有一种真正有效的方法?有没有人使用 SL4A 在 Android 上启动并运行 HTML5/javascript 应用程序?
【问题讨论】:
自从发布这篇文章以来,我已经尝试在 Titanium 中实现一些东西,但由于它不支持语音测试,它完全不适合我正在尝试构建的应用程序。对此的任何帮助将不胜感激。 另外,我在打包为依赖于 SL4A 的 APK 时尝试过此操作,但它仍然无法以三种方式中的任何一种方式工作。我目前正在将我的整个应用程序编写为单个 HTML 文件 - 哦,令人头疼 - 所以这个问题的任何解决方案将不胜感激。这也意味着我无法在我的 GUI 中使用任何图像 - 仅限 CSS 元素和颜色:/ 【参考方案1】:这个问题的答案就是RTFM——
droid.eventWait()
采用单个可选整数参数 - 等待任何事件的秒数。
droid.eventWaitFor()
另一方面,允许您在(强制)第一个参数中使用字符串过滤事件类型。
所有细节here。
我的错。
【讨论】:
我在链接到 HTML/javascript 中的相关脚本时遇到了同样的问题。知道怎么做吗?甚至可能吗?我正在尝试实现一个完整的 HTML + SL4A 应用程序。 问题中显示的方法(从答案中进行更正)应该可以工作-从python中的sys.path[0]
读取路径,加载HTML webview,然后触发如图所示的事件,添加javascript显示到您的 HTML 文件中。然后你需要像 Jquery 这样的东西来 dynamically add the script 到 DOM。
谢谢。假设您的所有文件将始终位于:file:///data/data/com.package.path/files/ (将您的应用程序作为 apk 共享时),您似乎可以直接从绝对路径引用静态内容。
上述方法是您不必假设的方法;它是一种在应用加载时动态计算绝对路径的方法。以上是关于Android SL4A:如何链接到 HTML/javascript 应用程序中的相关脚本?的主要内容,如果未能解决你的问题,请参考以下文章
在android中编写python(或任何其他SL4A)[关闭]