使用SL4A从Python发送事件到JavaScript
我想知道一个简单问题的答案,但一直没找到合适的答案(我在谷歌上搜索了好几个小时 :))
我在用sl4a和python玩,能够从js发送事件到python脚本,但js没有捕捉到我在下面代码中从python发送到js的eventPost。
有没有人知道这是怎么回事,或者有没有其他方法可以做到,而不需要使用registerCallback?
HTML代码:
<html>
<head>
<script>
var droid = new Android();
function doit(){
droid.makeToast("Text send :=>"+document.getElementById("msg").value);
droid.eventPost("doit",document.getElementById("msg").value);
}
function alert_me(data){
droid.makeToast("All done!");
document.getElementById("msg").value = '';
}
droid.registerCallback("done",alert_me);
</script>
</head>
<body>
<input type="text" name="boton" id="msg" value="" />
<input type="button" name="boton" value="Go!" onclick="javascript:doit()" />
</body>
</html>
Python代码:
import android,time
if __name__ == '__main__' :
droid = android.Android()
droid.webViewShow("file:///sdcard/sl4a/scripts/sample.html")
while True:
event = droid.eventWait().result
if event["name"] == 'doit':
droid.makeToast("Event catched! %s" % event['data'])
droid.eventPost("done","Done message")
time.sleep(2)
droid.exit()
2 个回答
很遗憾,我个人从来没有成功过,尝试过使用 registerCallback()
和 eventWaitFor()
这两个方法。不过,如果你还是想让它工作,我强烈建议你去下载 sl4a_r5x —— 这是一个非官方但更新更好的 SL4A 版本。这个版本支持使用 FullScreenUi,它是基于和原生 Android 应用相同的 xml 代码。通过这个,你可以实现你想要的功能,页面上还有相关的示例可以参考。
希望这些信息对你有帮助,也希望你对 SL4A 仍然感兴趣!
这个过程其实很简单,但不太明显,也没有很好地记录下来。
首先,你需要在网页视图中获取一个指向 Android
对象的连接。然后,你可以用它来注册一个或多个回调函数。为了简单起见,我们这里只做一个例子,就是用 Python 弹出一个带消息的提示框。
var droid = new Android();
droid.registerCallback("echo", function(msg) {
alert(msg.data)
});
在这个例子中,echo
是你希望这个回调处理的事件类型的名称。所以这个回调会处理“回声事件”。事件名称可以随便取,只要你觉得合适就行。
在启动网页视图的 Python 脚本中,你现在可以随时向注册的处理程序发送事件。
droid.eventPost("echo", "hello world")
这里的第二个参数是你想传递给 JavaScript 回调的消息。
需要注意的是,虽然你是以字符串的形式传递消息,但它在 JavaScript 函数中会作为一个对象到达。我们上面称这个对象为 msg
,它有一个叫 data
的属性,里面包含了你从 Python 端传过来的字符串。