# screen-share **Repository Path**: leemuyang/screen-share ## Basic Information - **Project Name**: screen-share - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-05 - **Last Updated**: 2025-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android ↔ Android 远程屏幕控制 Demo 本仓库实现了一个最小可运行的 Android 双端 Demo,用于演示「会话码 + PIN」建连、屏幕共享、以及通过无障碍服务注入点击事件的远程控制能力。整体目标参考 `requirements.md` 所述的 ToDesk 核心体验。 ## 仓库结构 ``` . ├── README.md # 快速上手文档(本文件) ├── requirements.md # 需求说明书 ├── server/ # Go 语言信令服务(Session + WebSocket 转发) └── mobile/ # Flutter Android App(Host / Controller 合一) ``` ## 运行前置 | 组件 | 版本建议 | | ---- | -------- | | Go | >= 1.25 | | Flutter SDK | >= 3.35(Dart 3.9) | | Android 设备 | Android 10+,需允许录屏 + 无障碍服务 | > **提示**:仓库已经在 macOS / Apple Silicon 环境下验证 `go test`、`flutter analyze`、`flutter test` 均可通过。 ## 启动步骤 ### 1. 启动信令服务(Go) ```bash cd server # 构建 & 运行(默认监听 0.0.0.0:8080) go run ./cmd/signal ``` - 环境变量 `SIGNAL_ADDR` 可覆盖监听地址,例如 `SIGNAL_ADDR=0.0.0.0:9999 go run ./cmd/signal`。 - 服务暴露两个接口: - `POST /api/session`:生成 9 位会话码、4 位 PIN(10 分钟有效)。 - `GET /ws`:`?code=xxx&role=host|controller&pin=xxxx`,用于转发 SDP/ICE/控制数据。 ### 2. 烧录 / 启动 Android Demo(Flutter) ```bash cd mobile flutter pub get # 连接两台 Android(或一台真机 + 模拟器),然后: flutter run --device-id ``` - App 启动后,在顶部文本框填入信令服务地址: - 模拟器连接本机:`http://10.0.2.2:8080` - 局域网真机:`http://<电脑局域网IP>:8080` - 页面左侧切换「被控端(Host)」或「控制端(Controller)」。 #### Host(被控端)流程 1. 点击「生成会话码」获得 9 位 code + 4 位 PIN,将 PIN 告知控制端。 2. 系统会提示开启无障碍服务「远程控制 Demo」→ 前往「设置 > 辅助功能」手动打开。 3. 点击「开始分享」,授予录屏权限后会推送屏幕流。 4. 控制端连入成功后,可以在 Host 侧看到实时状态,必要时可点击「停止」断开。 #### Controller(控制端)流程 1. 输入对方提供的会话码 + PIN,点击「连接」。 2. 收到远端画面后,可直接在视频区域点击,事件会经数据通道发送给 Host。 3. 需要断开时点击「断开」。 > 当前 Demo 仅注入轻触(tap)事件,用于证明「屏幕 + 基础输入」链路可跑通。 ## 常见问题 1. **看到“请开启辅助功能”提示**:Host 首次运行时必须在系统设置中启用「远程控制 Demo」无障碍服务,否则无法注入点击。 2. **移动网络或跨网访问**:需确保信令端口(默认 8080)可被外网访问,或部署在具备公网 IP 的服务器上。当前 Demo 尚未引入 STUN/TURN,建议在同一局域网内体验。 3. **HTTP 被拒绝**:Android 14+ 默认禁止明文流量,Manifest 已开启 `usesCleartextTraffic`,若部署 HTTPS,可直接将地址改为 `https://...`。 4. **macOS 控制端崩溃**:`flutter_webrtc` 在 macOS 14/15 上存在事件回调空指针问题,仓库已在本机通过修改 `~/.pub-cache/hosted/pub.dev/flutter_webrtc-1.2.0/macos/Classes/FlutterWebRTCPlugin.{h,m}` 规避(允许 `postEvent` 接收 `nil`)。若执行 `flutter pub cache repair` 后崩溃复现,可重新应用如下补丁: ```bash apply_patch <<'EOF' *** Begin Patch *** Update File: ~/.pub-cache/hosted/pub.dev/flutter_webrtc-1.2.0/macos/Classes/FlutterWebRTCPlugin.h @@ -void postEvent(FlutterEventSink _Nonnull sink, id _Nullable event); +void postEvent(FlutterEventSink _Nullable sink, id _Nullable event); *** End Patch EOF apply_patch <<'EOF' *** Begin Patch *** Update File: ~/.pub-cache/hosted/pub.dev/flutter_webrtc-1.2.0/macos/Classes/FlutterWebRTCPlugin.m @@ -void postEvent(FlutterEventSink _Nonnull sink, id _Nullable event) { - dispatch_async(dispatch_get_main_queue(), ^{ - sink(event); - }); -} +void postEvent(FlutterEventSink _Nullable sink, id _Nullable event) { + if (!sink) { + return; + } + dispatch_async(dispatch_get_main_queue(), ^{ + sink(event); + }); +} *** End Patch EOF ``` 运行 `flutter clean && flutter pub get && flutter build macos` 后即可恢复。 ## 后续扩展方向 - WebRTC TURN 中继、带宽自适应与质量档协商 - 双向键鼠/软键盘、更丰富手势(长按/拖拽/滚轮) - 会话列表、日志与指标上报 - Android Service 常驻 & 后台提示、通知栏控制 欢迎基于此 Demo 继续迭代到完整 ToDesk 级别体验。