Android SL4A:如何在HTML/javascript应用中链接相对脚本?

3 投票
1 回答
2967 浏览
提问于 2025-04-17 06:14

好的,我尝试了三种方法来把外部的JavaScript和CSS文件添加到我的SL4A应用中。我现在用的是2.3 Gingerbread(装了Cyanogenmod和谷歌应用),设备是ZTE Racer,网络是3UK,使用的是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));

但是,这个方法失败了,因为事件没有'result'属性,只有'error'属性(出现了一些Java异常:

org.json.JSONException: Value globalAppPath at 0 of type java.lang.String cannot be converted to int

从Python传来的路径字符串不能转换成一个整数?这是什么情况?!

最后,我尝试使用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

可能正是这个错误的路径导致了最初的失败——如果相对脚本在查找父目录,那就能解释为什么会出错。不过,这在不同厂商的Android系统中打包成APK后显然是不可靠的——我不能依赖SL4A初始化网页视图URL路径的方式,我更希望能使用更动态和正确的Python sys.path[0],如果我能把结果传递给网页视图就好了!

我觉得每一个失败都可以算作一个bug,但三者加在一起就让人沮丧了!我更愿意使用这个框架,而不是回到Titanium,因为它让我在遇到困难时可以直接用Python,而不想让JavaScript的界面卡住,但如果我不能把代码分成不同的文件,我就很难利用SL4A在手机上编辑的功能,每个代码文件里都要嵌入jQuery……

有没有什么实际可行的方法?有没有人用SL4A在Android上成功运行HTML5/JavaScript应用?

1 个回答

2

这个问题的答案很简单,就是去看看说明书 -

droid.eventWait()

这个函数可以接收一个可选的整数参数,表示等待某个事件的秒数。

droid.eventWaitFor()

而另一个函数则允许你通过第一个必填的字符串参数来过滤事件类型。

详细信息可以在 这里 找到。

我错了。

撰写回答