使用SL4A从Python发送事件到JavaScript

6 投票
2 回答
4547 浏览
提问于 2025-04-17 00:09

我想知道一个简单问题的答案,但一直没找到合适的答案(我在谷歌上搜索了好几个小时 :))

我在用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 个回答

0

很遗憾,我个人从来没有成功过,尝试过使用 registerCallback()eventWaitFor() 这两个方法。不过,如果你还是想让它工作,我强烈建议你去下载 sl4a_r5x —— 这是一个非官方但更新更好的 SL4A 版本。这个版本支持使用 FullScreenUi,它是基于和原生 Android 应用相同的 xml 代码。通过这个,你可以实现你想要的功能,页面上还有相关的示例可以参考。
希望这些信息对你有帮助,也希望你对 SL4A 仍然感兴趣!

1

这个过程其实很简单,但不太明显,也没有很好地记录下来。

首先,你需要在网页视图中获取一个指向 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 端传过来的字符串。

撰写回答