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

Android(Kotlin)中获取NodeID后延迟RemoteActivityHelper执行问题

问题分析

你的代码核心问题在于异步操作的执行顺序:获取Wear OS设备NodeID的逻辑在独立线程中异步执行,但RemoteActivityHelper.startRemoteActivity()是在主线程同步调用的——此时watchNode还未被赋值,自然会推送失败。日志里看到NodeID能成功获取,但时机晚于推送操作,就是这个原因。

解决方案

我们需要把依赖NodeID的推送逻辑,放到NodeID获取完成之后执行。推荐使用Google提供的Task API回调来处理,比手动管理线程更简洁可靠:

修改后的完整代码

@Composable
fun InstallButton() {
    val context = LocalContext.current
    OutlinedButton(onClick = {
        Log.d("InstallButton", "InstallButton pressed")
        context.pushLinkToWatch()
    }) {
        Text("Install on Watch")
    }
}

fun Context.pushLinkToWatch() {
    val uri = "https://play.google.com/store/apps/details?id=com.watchfacestudio.sedona"
    Log.d("PushLink", "Starting push process")

    // 使用Task API的回调处理异步结果
    Wearable.getNodeClient(applicationContext).connectedNodes
        .addOnSuccessListener { nodes ->
            if (nodes.isNotEmpty()) {
                val watchNode = nodes[0]
                Log.d("PushLink", "Got watch node: ${watchNode.id}")

                // 构建跳转Play Store的Intent
                val intent = Intent(Intent.ACTION_VIEW).apply {
                    addCategory(Intent.CATEGORY_BROWSABLE)
                    data = Uri.parse(uri)
                }
                Log.d("PushLink", "Created intent with URI: $uri")

                // 初始化RemoteActivityHelper并推送
                val remoteActivityHelper = RemoteActivityHelper(this, Executors.newSingleThreadExecutor())
                remoteActivityHelper.startRemoteActivity(intent, watchNode.id)
                Log.d("PushLink", "Sent intent to watch node: ${watchNode.id}")

                Toast.makeText(this, "Check your watch", Toast.LENGTH_SHORT).show()
            } else {
                Log.e("PushLink", "No connected Wear OS devices found")
                Toast.makeText(this, "No watch connected", Toast.LENGTH_SHORT).show()
            }
        }
        .addOnFailureListener { exception ->
            Log.e("PushLink", "Failed to get connected nodes", exception)
            Toast.makeText(this, "Failed to connect to watch", Toast.LENGTH_SHORT).show()
        }
}

关键改动说明

  • 移除了手动创建的Thread,改用Task.addOnSuccessListener在Node列表获取成功后执行推送逻辑,确保NodeID已就绪
  • 添加了addOnFailureListener处理获取Node失败的情况(比如没有连接手表),提升容错性
  • 把函数名从getNode()改为更贴合功能的pushLinkToWatch(),代码逻辑更清晰
  • 用apply函数简化Intent的构建,代码更简洁

额外优化建议

  • 不要直接取第一个Node,建议通过Node.isNearby或者Node.displayName判断是否为手表设备(避免多设备连接时选错)
  • 可以用market://details?id=xxx替代HTTPS链接,直接唤起手表上的Play Store应用,体验更好
  • 注意权限:确保应用已声明com.google.android.wearable.permission.RECEIVE_WEARABLE_DATA权限

内容的提问来源于stack exchange,提问作者Travis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:10:24