You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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更安全,还能获取回调结果):
    // 调用JS的sendParamsToROS函数,传递JSON格式参数
    val jsonParams = """{"speed": $paramInt, "distance": $paramFloat}"""
    webView.evaluateJavascript("sendParamsToROS('$jsonParams')") { result ->
        // 打印JS返回的结果,排查是否调用成功
        Log.d("ROS_PARAM", "JS调用结果: $result")
    }
    
    注意:如果传递的是JSON字符串,要给参数加单引号,避免JS解析错误。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:57