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

Android:检测配对手表上是否已安装Wear应用

检测配对手表是否安装目标应用的可行思路

方法1:通过Wear Message API实现跨端交互检测

这是兼容性较好的方案,需要手表端应用配合实现:

  • 移动端获取已连接的手表节点并发送检测请求:
    val nodeClient = Wearable.getNodeClient(context)
    nodeClient.connectedNodes.addOnSuccessListener { nodes ->
        val watchNodes = nodes.filter { it.isNearby } // 筛选配对的手表节点
        watchNodes.forEach { node ->
            val messageClient = Wearable.getMessageClient(context)
            messageClient.sendMessage(node.id, "/check_app_installed", "com.your.watch.app.package".toByteArray())
        }
    }
    
  • 手表端注册消息监听器,检测自身应用状态并返回结果:
    class WatchMessageListener : MessageClient.OnMessageReceivedListener {
        override fun onMessageReceived(messageEvent: MessageEvent) {
            if (messageEvent.path == "/check_app_installed") {
                val targetPackage = String(messageEvent.data)
                val isInstalled = try {
                    packageManager.getPackageInfo(targetPackage, 0)
                    true
                } catch (e: PackageManager.NameNotFoundException) {
                    false
                }
                // 将结果返回给移动端
                Wearable.getMessageClient(context).sendMessage(
                    messageEvent.sourceNodeId,
                    "/check_result",
                    if (isInstalled) "1".toByteArray() else "0".toByteArray()
                )
            }
        }
    }
    
    // 在手表端组件中注册监听器
    Wearable.getMessageClient(this).addListener(WatchMessageListener())
    
  • 移动端监听回复消息获取最终结果:
    class MobileMessageListener : MessageClient.OnMessageReceivedListener {
        override fun onMessageReceived(messageEvent: MessageEvent) {
            if (messageEvent.path == "/check_result") {
                val isInstalled = String(messageEvent.data) == "1"
                // 处理检测结果
            }
        }
    }
    
    // 在移动端组件中注册监听器
    Wearable.getMessageClient(this).addListener(MobileMessageListener())
    

方法2:利用Wearable PackageManagerClient直接查询(Android 11+)

Android 11及以上系统支持直接查询配对设备的应用安装状态,无需手表端额外配合:

  • 移动端通过以下代码直接查询手表端应用状态:
    val packageManagerClient = Wearable.getPackageManagerClient(context)
    val nodeClient = Wearable.getNodeClient(context)
    
    nodeClient.connectedNodes.addOnSuccessListener { nodes ->
        val watchNode = nodes.firstOrNull { it.isNearby } ?: return@addOnSuccessListener
        packageManagerClient.getPackageInfo(
            "com.your.watch.app.package", // 手表端应用包名
            PackageManager.GET_META_DATA,
            watchNode.id
        ).addOnSuccessListener {
            // 应用已安装
        }.addOnFailureListener { e ->
            if (e is PackageManager.NameNotFoundException) {
                // 应用未安装
            } else {
                // 处理其他错误,如权限不足
            }
        }
    }
    
  • 权限说明:
    • Android 11+ 中,若仅查询特定包名,可在AndroidManifest.xml中添加<queries>标签声明目标包,避免申请QUERY_ALL_PACKAGES权限:
      <queries>
          <package android:name="com.your.watch.app.package" />
      </queries>
      
    • 若需查询任意包名,需申请QUERY_ALL_PACKAGES权限(需符合Google Play权限政策)

注意事项

  • 确保移动端和手表端均引入Wearable支持库(com.google.android.gms:play-services-wearable)
  • 检测前需确认手表与移动端处于连接状态(筛选isNearby为true的节点)
  • 旧版本Wear OS设备可能不支持方法2,建议优先采用方法1保证兼容性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:05:24