Kotlin Android应用中JavaScript函数未调用问题求助
Android Kotlin应用向ROS机器人发送JSON参数问题排查
我正在用Kotlin开发一款Android应用,目标是通过JSON把用户自定义参数发送到搭载ROS的机器人上。机器人端已经配置好可以接收JSON对象,但我的应用现在遇到了问题:负责接收参数、转换为合适数据类型(int或float)并传递给JavaScript函数的Activity出了状况——这个JS函数本来是用来连接机器人WebSocket服务器,然后把参数发布到ROS话题的。不过这个Activity的其他功能(比如重置参数到默认值、跳转其他Activity)都能正常运行。
以下是该Activity的部分代码:
package com.example.jorge.autonavi3at import android.content.Intent import android.os.Build import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.annotation.RequiresApi import android.support.v7.app.AlertDialog import android.view.View import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import android.widget.SeekBar import kotlinx.android.synthetic.main.activity_triprobot.* const val maxdef = 20 const val mindef = 4 class triprobot : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_triprobot) supportActionBar!!.setDisplayHomeAsUpEnabled(false) supportActionBar!!.setHomeButtonEnabled(false) // 代码此处截断
可能的问题点与排查建议
从你的描述来看,核心问题集中在参数转换→传递给JS→ROS发布这个链路里,我给你几个方向去排查:
1. 先确认WebView的JS交互配置是否正确
WebView默认是禁用JavaScript的,首先要确保你在onCreate里开启了相关支持,并且配置了正确的WebViewClient:
// 补充WebView配置示例 webView.settings.javaScriptEnabled = true // 如果需要加载本地HTML/JS,还可以设置允许访问文件 webView.settings.allowFileAccess = true webView.webViewClient = object : WebViewClient() { // 可选:监听页面加载完成,确保JS函数已就绪再调用 override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) // 这里可以做初始化操作,比如连接WebSocket } }
2. 检查参数转换与JS调用的正确性
- 确保从SeekBar(或者其他输入控件)获取的值正确转换为int/float,比如:
// 假设你用SeekBar获取参数,转换为int val paramInt = seekBar.progress // 如果需要float,比如范围是4-20,可以这样转换 val paramFloat = mindef + (maxdef - mindef) * seekBar.progress / 100f - 调用JS函数时,推荐使用
evaluateJavascript(比loadUrl更安全,还能获取回调结果):
注意:如果传递的是JSON字符串,要给参数加单引号,避免JS解析错误。// 调用JS的sendParamsToROS函数,传递JSON格式参数 val jsonParams = """{"speed": $paramInt, "distance": $paramFloat}""" webView.evaluateJavascript("sendParamsToROS('$jsonParams')") { result -> // 打印JS返回的结果,排查是否调用成功 Log.d("ROS_PARAM", "JS调用结果: $result") }
3. 调试JS端的WebSocket与ROS发布逻辑
在你的JS函数里添加日志输出,然后在Android Studio的Logcat中过滤chromium标签,就能看到JS的控制台日志:
function sendParamsToROS(params) { console.log("收到Android传递的参数: ", params); // 检查WebSocket连接状态 if (ws && ws.readyState === WebSocket.OPEN) { // 发布到ROS话题的逻辑 ws.send(JSON.stringify({ topic: "/your_topic", msg: JSON.parse(params) })); console.log("参数已发送到ROS"); } else { console.error("WebSocket未连接"); } }
通过这些日志,你可以确认参数是否正确传递到JS,WebSocket是否正常连接,以及发布ROS话题时有没有错误。
4. 确认ROS端的消息格式匹配
最后要确保你发送的JSON结构和ROS话题的消息类型完全匹配。比如如果ROS话题用的是自定义消息类型,要保证JSON的键名、数据类型和消息定义一致。
如果能补充完整的Activity代码(特别是参数处理和调用JS的部分)以及JS函数的代码,就能更精准地定位问题啦!
内容的提问来源于stack exchange,提问作者JORGE
相关产品推荐
相关产品推荐

