Hinge:把手机和 Windows 电脑连接起来

最近完成了一个名为 Hinge 的跨设备工作台项目。

它的目标并不是再做一个云盘,也不是把手机完整投屏到电脑,而是把手机与 Windows 电脑之间最常用的几类操作连接起来:设备发现、文件传输、手机文件管理、相册浏览、剪贴板同步,以及一些轻量的工作区数据。

Hinge 采用局域网优先的设计。只要手机和电脑处于同一个局域网,设备就可以直接发现并建立会话,文件也尽量通过本地网络传输,不需要经过项目服务器中转。

GitHub 项目地址:Hinge

一、项目简介

Hinge 是一个由 Android 客户端和 Windows 客户端组成的跨设备工作台。

它主要解决几个日常问题:

  • 手机里的照片、视频、音乐和文档不方便在电脑上整理;
  • 文件在手机和电脑之间传输时,需要频繁使用数据线或第三方网盘;
  • 手机相册数量较多时,一次性加载会造成卡顿;
  • 设备已经连接,但文件管理、相册等功能页面没有正确复用连接状态;
  • 从手机向电脑拖文件,或者把电脑里的文件拖回手机时,缺少明确的目标反馈。

Hinge 的做法是把连接层、文件传输层和各个功能页面拆开,同时让 Android 与 Windows 共享一套跨端协议。这样,首页显示的连接状态和文件管理、相册等功能使用的会话,才可以来自同一个真实连接,而不是各自维护一套容易失效的状态。

二、为什么选择局域网直连?

对于同一用户的手机和电脑来说,局域网通常已经是最快、最直接的通信路径。

Hinge 的连接流程大致分成三步:

  1. 设备通过 UDP 广播发现消息;
  2. Windows 与 Android 交换设备身份和能力信息;
  3. 双方通过 TCP 会话传输控制命令、文件和工作区数据。

当前协议使用 UDP 52830 进行发现,使用 TCP 52831 建立会话。功能页面不会仅凭“发现到设备”就认为连接可用,而是要等身份握手和会话建立完成后,才开始请求文件、相册或其他数据。

这种区分很重要。设备发现只说明网络上存在一个服务,并不代表文件请求已经可以发送。把发现状态、连接状态和功能请求状态分开,可以减少“首页显示已连接,但文件管理仍然等待连接”这类状态分裂问题。

对于已经使用过的设备,Hinge 会保存必要的设备标识和最近的连接信息。下次发现到相同设备时,可以优先尝试恢复会话,减少重复操作。

不过,局域网连接仍然会受到路由器隔离、多网卡、防火墙、热点模式和 Android 厂商后台策略影响。因此 Hinge 不会把“同一个 Wi-Fi”简单等同于“必然可以通信”。

三、Android 端:移动设备上的工作入口

Android 客户端使用 Flutter 构建界面,同时通过 Android 原生能力处理前台服务、通知、媒体库、日历、应用列表和系统设置跳转。

1. 首页与设备状态

首页集中展示当前设备、连接状态、手机存储统计和设备操作入口。

手机品牌会根据设备信息选择本地品牌资源显示,而不是始终使用通用的手机图案。连接卡片展示的是设备名称,品牌信息用于辅助识别,两者不会混在一起。

2. 工作区

工作区包含一些不需要完整办公套件就能使用的轻量功能:

  • 笔记;
  • 待办;
  • 日历;
  • 相册。

笔记和待办适合处理临时记录,日历负责查看和标记已有日程,相册则用于浏览手机本地媒体内容。底部导航采用紧凑的悬浮胶囊形式,并为底部内容预留额外滚动空间,避免导航栏遮挡页面最后一部分内容。

3. Material You 动态取色

Hinge 支持 Android 12 及以上版本的 Material You / Monet 动态取色。

动态取色不是简单地从壁纸中取一个平均色,也不是固定使用某个绿色或蓝色。系统会根据壁纸生成一组颜色角色,应用再把这些角色映射到背景、卡片、按钮、文字和强调色上,从而保持整套界面的对比度和层级关系。

当动态取色关闭时,应用使用预置主题;开启后,卡片和控件仍然保留原有层次,不会因为只替换了主色而丢失原来的卡片效果。

4. 保活设置

Android 不同厂商对后台进程的处理差异很大,所以应用无法单独保证永久运行。Hinge 提供一个保活设置入口,把常见的系统设置集中起来:

  • 常驻通知;
  • 后台高耗电或电池优化设置;
  • 锁定后台和自启动;
  • 应用详情与权限状态。

这些设置最终仍然由系统控制,Hinge 只能把用户引导到对应页面,不能绕过厂商的省电策略。

5. 默认应用

接收文件后,用户可以为图片、视频和普通文件分别选择默认打开应用。候选应用会从系统中读取,并显示应用名称、包名和应用图标,方便区分名称相同的应用。

这个设置主要服务于“收到文件后点击通知打开”的场景。用户平时从文件管理器或相册打开文件时,仍然可以继续使用自己的常规工作流。

四、Windows 端:更接近桌面文件管理器的体验

Windows 客户端基于 .NET 8、Windows App SDK 和 WinUI 3 构建,重点是让手机内容在桌面上看起来像一个自然的文件来源,而不是一组只能查看的远程列表。

1. 文件管理分类

文件管理提供以下入口:

  • 最近文件;
  • 图片;
  • 视频;
  • 音频;
  • 文档;
  • 微信相册;
  • QQ 相册;
  • 手机存储。

微信和 QQ 图片会按约定的手机目录合并读取,不要求用户区分文件具体来自哪个缓存目录。文档入口则按 PDF、DOC、XLS、PPT、TXT 和其他类型进行筛选。

2. 分页加载与缩略图

大型手机存储和相册不能一次性把所有数据都读完,否则几千张照片或大量缓存文件会让窗口长时间无响应。

Hinge 采用“总数正常统计、内容分批读取”的方式:

  • 首次只加载前 200 项;
  • 用户继续滚动时再加载后续内容;
  • 图片和视频缩略图按批次读取;
  • 已离开的页面会取消过期请求;
  • 缩略图和预览文件使用缓存,不把每次预览都永久写入电脑。

因此,顶部可以显示手机端实际识别到的总数,但界面不会为了显示总数而一次性创建几千个缩略图控件。

3. 文件筛选、排序和多选

文件管理支持按类型筛选,也支持以下排序方式:

  • 名称;
  • 类型;
  • 大小,从小到大或从大到小;
  • 时间,从旧到新或从新到旧。

所有文件项都支持选择。多选后可以保存到电脑或删除;保存位置使用设置中配置的自定义目录,并在更新应用后继续保留。

对于“最近文件”,Hinge 会尽量排除目录项、缓存索引和明显的临时文件,避免把文件夹名称或 0B 的缓存占满主要视图;但在手机存储的真实目录浏览中,这些项目仍然可以按原始结构显示。

4. 预览交给系统默认应用

Windows 端不再强行维护一个复杂的内置播放器。双击图片、视频或音乐文件时,Hinge 会调用当前 Windows 文件关联对应的默认应用打开。

这样做有几个好处:

  • 用户可以继续使用自己习惯的图片、视频或音乐软件;
  • 关闭预览时由系统应用负责释放播放资源;
  • 不会因为多个自定义播放器实例没有释放而出现重复播放;
  • 应用本身不需要维护不同媒体格式的解码和控制界面。

五、拖拽传输

拖拽是 Hinge 与普通文件管理器体验差异最明显的部分之一。

从手机拖到电脑

Windows 文件管理和相册中的远程文件可以直接拖到桌面或其他支持文件接收的位置。Hinge 会在真正建立文件拖动状态后才显示拖拽提示,单纯移动窗口标题栏或拖动其他程序窗口不会触发投放动画。

如果用户在应用内开始拖动文件但临时反悔,可以把文件拖到侧边的取消区域。取消操作不会写入手机,也不会在最近文件中伪造“已发送”的记录。

从电脑拖到手机

资源管理器中的文件可以拖入 Hinge 的右侧内容区域:

  • 拖到文件管理区域,默认保存到手机 Download/Office Suite/ 下对应的分类目录;
  • 拖到相册集,保存到相册集对应的手机目录;
  • 鼠标按住不松手时,目标区域会实时高亮并显示当前保存位置;
  • 侧边栏不是文件投放区域,不会触发传输动画或发送操作。

拖拽目标必须明确区分文件区、相册集区域和侧边栏。只有进入有效的内容区域后,Hinge 才会接收外部文件并显示投放反馈。

六、连接、传输与性能处理

跨设备应用最容易出现的问题,不一定是某个页面的 UI,而是多个功能同时使用网络连接时的数据竞争。

Hinge 在连接层做了几项约束:

  • Android 端串行化 Socket 输出,避免多个功能同时写入破坏帧边界;
  • Windows 端为等待中的请求设置超时,并在断线时回收旧请求;
  • 文件列表和缩略图请求采用分页与取消机制;
  • 大文件传输与界面状态更新分开处理;
  • 前台服务负责在回到桌面后维持局域网会话;
  • 功能页面只复用当前有效会话,不重复创建各自的连接。

这些策略的目的不是简单地“开更多线程”,而是在网络、CPU、内存和 UI 响应之间保持平衡。特别是媒体库读取,盲目并发反而容易让手机或 Windows 窗口出现更严重的卡顿。

七、项目技术栈

技术 用途
Flutter / Dart Android 客户端 UI 与业务逻辑
Android 原生 API 前台服务、通知、媒体库、日历和系统设置
.NET 8 Windows 客户端和核心服务
Windows App SDK / WinUI 3 Windows 原生界面、窗口和系统集成
UDP 局域网设备发现
TCP 会话、控制命令和文件传输
MediaStore Android 图片、视频、音频和文档媒体索引
Windows 文件关联 调用用户默认的图片、视频和音乐应用

项目结构大致如下:

1
2
3
4
5
6
android/                 Flutter Android 客户端与原生桥接
windows/ WinUI 3 客户端、核心层和平台层
protocol/ 跨端发现、会话、传输和工作区协议
docs/ 架构、兼容性、开发状态和发布流程
installer/ Windows EXE 安装器源码
scripts/ 构建与辅助脚本

八、隐私与安全边界

Hinge 默认不要求用户注册账号,也不把局域网文件上传到项目服务器。设备发现和文件传输以本地网络为主要路径。

但“局域网直连”不等于完整的端到端安全方案。当前项目仍然需要继续完善真实身份校验、端到端加密和更细的权限模型。因此,在不可信公共网络中使用时,仍应确认当前网络环境和设备列表。

项目更重视把边界说清楚:自动化测试可以验证协议和状态机的一部分,但不能代替真实手机、真实路由器、不同 Android 厂商和不同 Windows 权限环境的验收。

九、构建与安装

Android 端使用 Flutter 和 JDK 17,Windows 端需要 .NET 8 SDK、Windows SDK、Visual Studio C++ 桌面开发工具以及 Windows App SDK / WinUI 3 构建环境。

Android 开发构建:

1
2
3
4
5
cd android
flutter pub get
flutter analyze --no-pub
flutter test --no-pub
flutter run

Windows 构建:

1
2
dotnet build windows/Hinge.sln --configuration Release
dotnet test windows/Hinge.sln --configuration Release

Windows 后续公开发布的安装方式保持简单,只提供两种:

  • EXE 安装包:可以选择安装目录,并支持覆盖更新;
  • 便携版 ZIP:解压后直接运行。

不会要求普通用户安装测试证书,也不会把个人签名文件或密码放进源码仓库。Android 发布包则由发布者使用自己的签名库构建。

十、当前阶段与后续方向

当前开发版为 v1.0.17-dev.1,Android 运行版本为 1.0.17+18,Windows 运行版本为 1.0.17.0

目前仍需要更多真实设备验收的部分包括:

  1. 不同 Android 厂商在锁屏、省电和切后台后的持续连接;
  2. 大型微信、QQ 相册和文档目录的读取速度与内存占用;
  3. 多网卡、热点、IPv4 变化、防火墙和弱网恢复;
  4. 不同 Windows 默认文件关联应用的兼容性;
  5. 不同 UAC 权限级别下的外部拖放行为;
  6. 真实身份安全、端到端加密、通知回复和 OCR 等能力。

Hinge 后续会继续围绕三个方向迭代:让连接更可靠,让大量文件更容易管理,让跨设备传输更接近 Windows 与 Android 各自原生的使用习惯。

结语

Hinge 并不是把手机简单映射到电脑上,而是尝试把“跨设备办公”拆成一组真正有用、可以独立完成任务的能力。

从局域网发现,到会话恢复;从手机媒体库的分页读取,到 Windows 文件关联;从相册缩略图,到双向拖拽传输,这个项目涉及的并不只是界面,还包括协议、状态、缓存、权限和不同操作系统之间的边界。

如果你也关心 Flutter、WinUI 3、局域网传输或跨设备产品设计,可以在 GitHub 查看 Hinge 的源码:

GitHub: https://github.com/Chengeeker/Hinge

项目采用 MIT License,欢迎提交 Issue、建议和改进方案。