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权限政策)
- Android 11+ 中,若仅查询特定包名,可在
注意事项
- 确保移动端和手表端均引入Wearable支持库(
com.google.android.gms:play-services-wearable) - 检测前需确认手表与移动端处于连接状态(筛选
isNearby为true的节点) - 旧版本Wear OS设备可能不支持方法2,建议优先采用方法1保证兼容性
内容的提问来源于stack exchange,提问作者MedCh
相关产品推荐
相关产品推荐

