使用 sl4a 将事件从 python 发送到 javascript

Posted

技术标签:

【中文标题】使用 sl4a 将事件从 python 发送到 javascript【英文标题】:send events from python to javascript using sl4a 【发布时间】:2011-11-01 13:13:40 【问题描述】:

我想知道一个简单问题的答案,但我没有找到一个好的答案 (我已经用谷歌搜索了几个小时:))

我正在用 python 玩 sl4a,我可以将事件从 js 发送到 python 脚本,但是 js 没有捕捉到 eventPost 我在下面的代码中从 python 到 js。

任何人都知道这是如何完成的,或者是否有其他方法没有 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()

【问题讨论】:

你的 JS alert_me 函数没有使用它收到的参数。如果是这样,则 arg 将有一个名为 data 的成员,因此在您的函数中 data.data 将评估为 "Done Message" 【参考方案1】:

这很容易上手,但并不明显或没有很好的文档记录。

首先,您想要获取到 webview 中 Android 对象的钩子。然后您可以使用它来注册一个或多个回调。举个简单的例子,我们只做一个弹出警告的例子,其中包含来自 Python 的消息。

    var droid = new Android();

    droid.registerCallback("echo", function(msg) 
        alert(msg.data)
    );

在这种情况下,echo 是您希望此回调处理的事件类型的名称。所以这将处理“回声事件”。事件名称是任意字符串,只要有意义就可以调用它们。

在启动 webview 的 Python 脚本中,您现在可以随时将事件发布到已注册的处理程序。

droid.eventPost("echo", "hello world")

这里的第二个参数是您要传递给 JavaScript 回调的消息。

请注意,尽管您将消息作为字符串传回,但它作为对象到达 JavaScript 函数。该对象,我们在上面称之为msg,有一个名为data 的属性,其中包含您从Python 端传递的字符串。

【讨论】:

【参考方案2】:

不幸的是,我个人从来没有能够使用registerCallback()eventWaitFor() 来完成这项工作。但是,如果您仍然热衷于使其正常工作,我强烈建议您继续下载sl4a_r5x - 一个非官方但更新和更新的 SL4A 版本。它支持使用基于原生 Android 应用程序使用的相同 xml 代码的 FullScreenUi。有了它,您可以做您想做的事,并且可以在页面上找到示例。希望这对您有所帮助,并且您仍然对 SL4A 感兴趣!

【讨论】:

实际上上面的脚本工作正常 :) 我正在使用该版本的 sl4a 但我仍在等到 fullscreenUI 变得更有效地解析一些现在不起作用的 xml 属性。今天,更有效的 android 编程方法仍然是 java 或 c# 与 mono..因为没有 webstyle 的 python 的 gui 是一场噩梦。谢谢你的回答 如果您不需要看起来像原生的,那么使用 jQuery Mobile UI 之类的东西来构建界面是微不足道的。

以上是关于使用 sl4a 将事件从 python 发送到 javascript的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 开始:Java 或 Python (SL4A)

sl4a python通知问题

Android:从 Java 代码调用 Python 脚本(通过 SL4A)

Python xmpppy客户端未向appengine xmpp客户端发送消息

使用没有 SL4A 的 Python android.py 模块

使用 SL4A (Python) 和蓝牙