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

Wear OS表盘配套App:RemoteActivityHelper实现与Compose按钮问题

解决方案

一、解决RemoteActivityHelper的未解析引用问题

1. 确认依赖与权限

确保Module级build.gradle.kts(或build.gradle)已引入必要依赖:

dependencies {
    implementation "androidx.wear.remote-interactions:remote-interactions:1.0.1"
    implementation "com.google.android.gms:play-services-wearable:18.1.0"
}

在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.wearable.permission.RECEIVE_WEARABLE_MESSAGES" />
<uses-feature android:name="android.hardware.type.watch" android:required="false" />

2. 正确获取context、executor、nodeId

  • context:在Compose中通过LocalContext.current获取,或直接使用Activity实例(如MainActivity.this)。
  • executor:用ContextCompat.getMainExecutor(context)获取主线程执行器,避免线程安全问题。
  • nodeId:通过NodeClient异步获取已连接的手表节点,不能硬编码。示例代码:
private suspend fun getWatchNodeId(context: Context): String? {
    val nodeClient = Wearable.getNodeClient(context)
    val connectedNodes = nodeClient.connectedNodes.await()
    return connectedNodes.firstOrNull { it.isNearby }?.id
}

二、Compose中绑定按钮点击逻辑

Compose无需依赖XML ID,直接在Button的onClick参数中实现逻辑即可。将核心变量(如remoteActivityHelper)放在Composable可访问的作用域内,用remember保持实例状态。

完整MainActivity.kt示例

import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillSize
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat
import androidx.wear.remote.interactions.RemoteActivityHelper
import com.google.android.gms.wearable.Wearable
import kotlinx.coroutines.tasks.await

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            WatchFaceInstallerScreen()
        }
    }
}

@Composable
fun WatchFaceInstallerScreen() {
    val context = LocalContext.current
    val remoteActivityHelper = remember {
        RemoteActivityHelper(context, ContextCompat.getMainExecutor(context))
    }
    var watchNodeId: String? by remember { mutableStateOf(null) }

    // 初始化时异步获取手表节点ID
    LaunchedEffect(Unit) {
        watchNodeId = getWatchNodeId(context)
    }

    Column(
        modifier = Modifier.fillSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(
            onClick = {
                watchNodeId?.let { nodeId ->
                    launchWatchFacePlayStore(context, remoteActivityHelper, nodeId)
                }
            },
            enabled = watchNodeId != null
        ) {
            Text(text = if (watchNodeId != null) "推送表盘到手表" else "未检测到连接的手表")
        }
    }
}

private suspend fun getWatchNodeId(context: Context): String? {
    return try {
        val connectedNodes = Wearable.getNodeClient(context).connectedNodes.await()
        connectedNodes.firstOrNull { it.isNearby }?.id
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

private fun launchWatchFacePlayStore(
    context: Context,
    remoteActivityHelper: RemoteActivityHelper,
    nodeId: String
) {
    // 替换为你的表盘在Play Store的包名链接
    val playStoreUri = android.net.Uri.parse("market://details?id=com.your.watchface.package")
    val intent = remoteActivityHelper.createRemoteIntent(playStoreUri, listOf(nodeId))
    context.startActivity(intent)
}

关键说明

  • 用LaunchedEffect在Composable初始化时异步获取手表节点,避免阻塞UI线程。
  • 按钮enabled状态根据手表连接状态动态切换,优化用户体验。
  • createRemoteIntent方法会将Play Store链接推送到指定手表节点,触发手表端打开Play Store安装表盘。

内容的提问来源于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 06:13:18