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

如何在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}');
        }
      }
    }
  }
}

注意事项

  1. 网络环境:确保移动设备与Android TV在同一WiFi网络,且路由器未开启AP隔离(部分路由器默认开启,会阻断设备间局域网通信)。
  2. 服务类型适配:不同品牌Android TV可能使用自定义mDNS服务类型,若默认类型无法找到设备,可尝试设备厂商指定的服务标识。
  3. 权限动态申请:Android 10+、iOS 14+需动态申请本地网络权限,代码中需处理权限申请逻辑,避免因权限不足导致扫描失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:13:11