手机视觉感知能力教程 | 新手必看精选排行榜
摘要
在Android手机上部署MCP感知服务器,集成Qwen3-VL模型与MNN推理引擎,实现本地化视觉和听觉分

Qwen3-VL+MCP完全指南:将手机化身AI感知终端

深度玩转Agent的开发者,大概率都遭遇过一个瓶颈:Agent对物理世界处于“感知盲区”。大语言模型无法直接查看你手中的开发板究竟运行着哪段代码,辨别不了设备是否发出异常声响,更无法一键调用你的手机摄像头来解析周边环境。
本文是「手机上的创意AI」挑战赛的首发教程。学完这期内容,你将掌握三项关键技能:
- 在 Android 手机上搭建一套完整的MCP感知服务端;
- 通过 Claude Code 远程执行一条指令,启动
phone_look或phone_listen; - 让手机真正具备本地化的视觉与听觉语义解析能力。
其底层逻辑,是将 Qwen3-VL 多模态模型与 MNN 推理引擎直接嵌入手机。所有原始的音频、视频数据完全在设备端处理,云端大模型只接收经过端侧语义提取的结构化描述,从而安全、高效地“理解”真实世界。
核心架构:为何选择端侧MCP?
为AI构建“视觉系统”,常规方案是将手机摄像头作为网络摄像头,通过RTSP协议实时推送原始视频流至云端处理。这一做法的短板很明显:传输带宽高、云端算力负载重,且存在隐私泄露风险。
换个策略——让手机成为“本地计算核心”。
直接在手机上运行多模态大模型,摄像头捕捉的画面、麦克风接收的声音,全部在设备端实时转化为几KB的结构化文本(例如场景描述、异常状态清单),仅将最终的“结论”传递给云端AI。这即是端侧语义提取的技术路径。
整个项目的数据流设计极为精简:
手机 (摄像头/麦克风) → 端侧分析(MNN+Qwen3-VL) → 结构化JSON → MCP Tool → Claude Code (或其他Agent)
为了让云端AI以标准化方式便捷调用手机能力,我们在应用中内置了一个MCP服务。你可以将其理解为AI领域的“通用USB-C接口”——无需处理复杂的抓包逻辑,也不用手动构建WebSocket桥接,云端一行命令即可安全、流畅地接入手机的实时感知数据。
我们需完成哪些步骤?如何实施?
具体的实现路径清晰明了:
- 构建一个 Android 应用,并在其内部集成 MCP Server;
- 接入 MNN 端侧推理引擎,使 Android 设备能利用ARM SoC指令集(如 SME2)进行高效计算;
- 将预先转换好的 Qwen3-VL 模型文件部署至手机本地存储;
- 生成 MCP 鉴权凭证,通过命令行在 Claude Code 中完成连接配置。
项目代码参考自以下仓库:https://github.com/karminski/eyes-on-my-phone。克隆后,核心目录结构如下:
Plain Text
eyes-on-my-phone/
├── android-app/ # 主工程:Kotlin + Compose + Ktor MCP + JNI
│ └── app/src/main/
│ ├── jniLibs/arm64-v8a/ # 预编译的 libMNN.so(ndk-r27版本)
│ ├── cpp/ # C++ 桥接层:eyes_mnn_bridge + eyes_llm_session
│ └── ja va/... # 核心业务逻辑
├── MNN-master/ # MNN 源码目录
├── mcp-schemas/ # 工具函数的 JSON Schema
├── prompts/ # 端侧大模型的提示模板
└── docs/ # 专题文档
⚠️ 项目中有几个关键目录需特别留意:
jniLibs/arm64-v8a/libMNN.so是 MNN 推理引擎的动态链接库,项目编译针对 ndk-r27。若需其他 NDK 版本,须自行编译并替换该文件。MNN-master/目录存放的是编译 JNI 模块所需的 MNN 头文件及其源代码。若计划更新 MNN 版本,下载新代码后替换此目录即可。
快速验证:打通MCP基础通信链路
首先构建最小可用链路:让 Claude Code 通过局域网调用手机摄像头,确认端到端通信是否正常。
为降低验证阶段的不确定性,这一步骤暂不加载大模型。应用会自动降级为本地启发式分析,返回一条包含 degraded_mode: true 的占位响应。只要收到该响应,即证明端到端链路已建立,后续集成 Qwen3-VL 模型将十分顺畅。
运行项目:在 Android Studio 中通过
Open打开项目的android-app/目录,待 Gradle 同步完毕后,点击Run即可将应用安装至手机。权限配置:首次启动时,请授予相机、麦克风及通知权限。特别提醒:Android 12 及以上版本对后台摄像头访问限制严格,应用必须运行前台服务以维持正常功能。
启动服务:点击界面上的
Start MCP Service按钮,屏幕将显示 MCP URL(如http://192.168.1.100:8765/mcp)及对应的 Bearer Token。

切回电脑终端,使用 Claude Code 进行连接:
claude mcp add --transport http --scope project eyes-on-phone http://192.168.1.100:8765/mcp --header "Authorization: Bearer 你的Token"
配置完成后,在 Claude Code 中执行:
使用 phone_look 描述手机摄像头前的场景。prompt: "镜头里有什么?"
若 Claude 成功返回一条 JSON 响应(即使内容为 degraded 状态),恭喜,你的电脑已与手机摄像头建立物理连接!
编译实战:在 Mac 上构建完整版 libMNN.so
关于 libMNN.so 的说明:若项目提供的 .so 文件在你的设备上可正常运行,可直接跳过本节。若因 NDK 版本冲突或其他问题无法使用,请按以下步骤自行编译。
开发环境准备(Windows)
- 安装最新版 Android Studio,并配置 Android SDK(例如安装至
D:\software\AndroidSDK); - 在项目的
android-app/local.properties中指定 SDK 路径:
sdk.dir=D:\\software\\AndroidSDK
- 通过 SDK Manager 安装 NDK 27;
- 准备一台 Android 测试机(建议
arm64-v8a架构,内存 ≥4GB)。开启 USB 调试,并确保手机与电脑连接同一 Wi-Fi(MCP 通信依赖局域网 IP)。
参考设备:三星 Tab S5e(SM-T727V),4GB 内存,可运行 2B 模型,推理速度偏慢但适用于离线监控场景。
编译 libMNN.so
推荐在 macOS 或 Linux 环境下操作,Windows 用户可使用 WSL。
- 克隆 MNN 源码:https://github.com/alibaba/MNN
- 准备 NDK 环境:可将 Windows 上的
AndroidSDK/ndk/27.x目录复制至 Mac/Linux,然后设置环境变量:
export ANDROID_NDK=/path/to/ndk/27.0.12077973
- 进入 MNN 的 Android 构建目录,执行以下命令(注意:默认构建仅生成数MB的基础库,无法支持多模态功能,请务必使用以下参数):
cd MNN/project/android
mkdir -p build_64 && cd build_64
../build_64.sh "-DMNN_LOW_MEMORY=true \
-DMNN_CPU_WEIGHT_DEQUANT_GEMM=true \
-DMNN_BUILD_LLM=true \
-DMNN_SUPPORT_TRANSFORMER_FUSE=true \
-DMNN_ARM82=true \
-DMNN_USE_LOGCAT=true \
-DMNN_OPENCL=true \
-DLLM_SUPPORT_AUDIO=true \
-DMNN_BUILD_OPENCV=true \
-DMNN_IMGCODECS=true \
-DMNN_OPENCV=true \
-DMNN_BUILD_AUDIO=true \
-DMNN_SEP_BUILD=OFF"
make -j
参数说明:
-DMNN_BUILD_LLM=true:启用大语言模型模块-DLLM_SUPPORT_AUDIO=true:开启音频处理支持-DMNN_BUILD_OPENCV=true:开启图像处理支持-DMNN_SEP_BUILD=OFF:最关键选项,它将 LLM、视觉、音频等所有功能静态链接至同一个libMNN.so中
编译完成后,libMNN.so 通常位于 MNN/apps/Android/MnnLlmChat/app/src/main/jniLibs/arm64-v8a/ 目录,使用 ls -lh 查看文件大小(应明显大于基础版)。
将新生成的 libMNN.so 替换项目中的 jniLibs/arm64-v8a/libMNN.so 文件即可。
JNI 桥接:使 Android 工程兼容 MNN
将编译好的 libMNN.so 放置到 Android 工程的 JNI 库路径:
android-app/app/src/main/jniLibs/arm64-v8a/libMNN.so
为使 C++ 层顺利调用 MNN 接口,需将 MNN 源码(MNN-master 目录)置于项目仓库根目录,与 android-app 平级。若克隆完整项目,这些文件通常已就位。
一切准备就绪后,在 Android Studio 中执行 Rebuild Project,重新编译 JNI 层(如 eyes_mnn_bridge.cpp)。注意加载顺序:务必先加载 MNN 库,再加载 eyes_mnn_bridge 库:
System.loadLibrary("MNN");
System.loadLibrary("eyes_mnn_bridge");
顺序正确,JNI 桥接即告完成。
模型部署:将 Qwen3-VL 安装至手机
应用代码已就绪,接下来将模型文件部署至手机本地。
获取模型
可从 Hugging Face 或 ModelScope 下载已转换为 MNN 格式的 Qwen3-VL 模型。推荐使用 ModelScope(国内访问更便捷):MNN/Qwen3-VL-2B-Instruct-MNN
模型体积约 1.3GB,下载后应包含以下文件:config.json、llm.mnn、llm.mnn.weight、visual.mnn、visual.mnn.weight
部署至手机私有目录
将模型放入应用的私有目录:
/data/data/com.eyesonphone/files/mnn_models/qwen3-vl-2b
使用以下命令(Windows PowerShell 或任意 adb 环境)完成部署:
adb push D:\你的模型目录\. /data/local/tmp/qwen3-vl-2b/
adb shell run-as com.eyesonphone mkdir -p files/mnn_models/qwen3-vl-2b
adb shell run-as com.eyesonphone cp -r /data/local/tmp/qwen3-vl-2b/. files/mnn_models/qwen3-vl-2b/
adb shell rm -rf /data/local/tmp/qwen3-vl-2b
注意:JNI 初始化时识别的是 config.json 的完整绝对路径,务必确保文件结构完整无误。
端到端联调:验证完整功能
现在打开应用,点击屏幕上的 Start MCP Service。观察 Model 卡片的状态:Weights OK · loading MNN → 等待数十秒(视手机性能而定) → Ready (Qwen3-VL) 加载成功!
也可通过 Logcat 确认加载状态:
adb logcat -s EyesMNN
# 预期输出:nativeInit ok: /data/user/0/com.eyesonphone/files/mnn_models/qwen3-vl-2b/config.json
效果测试:在 Claude Code 中输入 执行 phone_look, prompt 是 "你看到了什么?"。端侧 VLM 将依次执行 Prefill(图像编码)与 Decode(逐词生成)两个阶段。手机屏幕及 Claude Code 终端会同步返回结构化的场景描述。实测显示,系统可精准识别红绿灯状态、窗外物体等复杂场景。


尝试一些复杂提问,例如询问是红灯还是绿灯,或窗外是否有小鸟,端侧模型均能给出准确判断!


至此,手机中的 Qwen3-VL 已成功“睁眼”,并在本地独立完成了多模态分析!
避坑指南
分享几个实际踩过的坑,帮你有效规避。
输出异常截断
模型经常输出如 {"summary": " 后即停止,tokens 计数仅 2 便强行结束。排查发现,预编译版 libMNN 在 step decode 过程中,遇到 Markdown 代码块前缀(如 ```),会错误触发假结束符,导致 JNI 层误判生成完成而提前终止。
解决方案:在 C++ 层打了一个简单补丁——若生成内容长度不足 48 个字符,则忽略该结束信号,强制继续生成。
模型卡在 "verifying..."
模型的加载与校验建议交由后台协程处理,切勿在主线程执行,否则界面会长时间无响应,停滞在 "verifying..." 状态。
基于此框架,可延伸出多个实用场景,希望能激发你的创意:
开发板远程监控:将手机固定在开发工位上方,代码出错时,直接让 Claude 执行
/phone_look查看屏幕上的错误提示或 LED 状态,实现大模型辅助硬件调试。还可接入蓝牙舵机模拟按键操作,构建 AI 全自动硬件调试闭环。3D 打印守护者:通过
phone_watch_start启动周期性巡检。一旦本地模型检测到 3D 打印机出现“拉丝”或“炒面”(打印失败),立即通过 SSE 长连接主动通知桌面端 Agent 暂停打印并发出警报。家庭隐私监控:将旧 Android 手机置于家中角落,所有图像与音频数据仅在本地处理,云端大模型仅接收结构化的文字摘要。无需购买昂贵的云摄像头,同时有效保护家庭隐私。
基于这个示例,你可以自由发挥想象力。结合 Tailscale 等组网工具,还能远程访问家中设备,真正实现“千里眼、顺风耳”的 AI 感知体验。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。