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 应用程序中的相关脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何从新网站安装 sl4a?

在android中编写python(或任何其他SL4A)[关闭]

Python SL4A 开发

如何将整个 python 解释器打包到 Android APK 中?

Google 是不是仍支持 Android 的 SL4A?

从 Android 开始:Java 或 Python (SL4A)