如何在Flutter应用中发现同一WiFi局域网内的Android TV设备
在Flutter中发现同一WiFi局域网内的Android TV设备
方法一:使用mDNS服务发现(推荐)
Android TV原生支持mDNS(多播DNS)服务,通过搜索特定服务类型可快速定位同网络设备。Flutter官方提供的multicast_dns包可实现该功能。
步骤1:添加依赖
在pubspec.yaml中引入依赖:
dependencies: multicast_dns: ^0.3.2+4 # 请使用最新版本
步骤2:实现搜索逻辑
以下代码会搜索支持Google Cast或Android TV Remote服务的设备(多数Android TV同时兼容这两类服务):
import 'package:multicast_dns/multicast_dns.dart'; Future<void> scanAndroidTVs() async { final mdnsClient = MDnsClient(); await mdnsClient.start(); try { // 可选服务类型:_googlecast._tcp.local. 或 _androidtvremote2._tcp.local. const targetService = '_googlecast._tcp.local.'; // 查找服务指针记录 await for (final ptrRecord in mdnsClient.lookup<PtrResourceRecord>( ResourceRecordQuery.serverPointer(targetService), )) { // 获取服务的SRV记录(包含端口和主机名) await for (final srvRecord in mdnsClient.lookup<SrvResourceRecord>( ResourceRecordQuery.service(ptrRecord.domainName), )) { // 解析主机名对应的IPv4地址 await for (final ipRecord in mdnsClient.lookup<IPAddressResourceRecord>( ResourceRecordQuery.addressIPv4(srvRecord.target), )) { print('找到设备:${ptrRecord.domainName},IP:${ipRecord.address},端口:${srvRecord.port}'); // 可将设备信息存入列表用于UI展示 } } } } finally { mdnsClient.stop(); } }
步骤3:配置权限
- Android:在
android/app/src/main/AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
- iOS:在
ios/Runner/Info.plist中添加权限描述和Bonjour服务声明:
<key>NSLocalNetworkUsageDescription</key> <string>需要访问本地网络以发现同一WiFi下的Android TV设备</string> <key>NSBonjourServices</key> <array> <string>_googlecast._tcp</string> <string>_androidtvremote2._tcp</string> </array>
方法二:UDP广播扫描
若目标Android TV运行了自定义UDP服务,可通过发送广播包并监听响应发现设备(需设备端配合实现服务,适用于自定义场景)。
简化示例代码
import 'dart:io'; import 'dart:convert'; Future<void> udpBroadcastScan() async { final socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0); socket.broadcastEnabled = true; // 发送广播到局域网广播地址(需根据实际网段调整,如192.168.0.255) final broadcastAddr = InternetAddress('192.168.1.255'); const port = 5555; // 设备端监听的端口 socket.send(utf8.encode('DISCOVER_TV'), broadcastAddr, port); // 监听设备响应 await for (final event in socket) { if (event == RawSocketEvent.read) { final datagram = socket.receive(); if (datagram != null) { final response = utf8.decode(datagram.data); if (response.contains('ANDROID_TV')) { print('找到Android TV:${datagram.address}'); } } } } }
注意事项
- 网络环境:确保移动设备与Android TV在同一WiFi网络,且路由器未开启AP隔离(部分路由器默认开启,会阻断设备间局域网通信)。
- 服务类型适配:不同品牌Android TV可能使用自定义mDNS服务类型,若默认类型无法找到设备,可尝试设备厂商指定的服务标识。
- 权限动态申请:Android 10+、iOS 14+需动态申请本地网络权限,代码中需处理权限申请逻辑,避免因权限不足导致扫描失败。
内容的提问来源于stack exchange,提问作者shakti goyal
相关产品推荐
相关产品推荐

