游乐游手机版
首页/AI热点日报/热点详情

如何让手机拥有视觉感知能力详细教程首发

类型:热点整理2026-05-30
手机变身AI之眼:Qwen3-VL结合MCP完整部署指南 玩Agent的朋友,大概率都遇过这个让人头疼的难题:Agent对现实世界完全是“盲人”状态。大模型无法感知你面前的开发板正在运行什么程序,听不到设备是否存在异响,更不可能直接调用手机摄像头观察周围环境。 这篇是「手机上的创意AI」挑战赛的首期

手机变身AI之眼:Qwen3-VL结合MCP完整部署指南

玩Agent的朋友,大概率都遇过这个让人头疼的难题:Agent对现实世界完全是“盲人”状态。大模型无法感知你面前的开发板正在运行什么程序,听不到设备是否存在异响,更不可能直接调用手机摄像头观察周围环境。

这篇是「手机上的创意AI」挑战赛的首期教程。读完它,你就能掌握三项核心技能:

  • 在Android手机上部署一套MCP感知服务器;
  • 使用Claude Code远程一句话调用phone_lookphone_listen
  • 让手机真正具备本地化的视觉与听觉分析能力。

背后的核心技术,是将Qwen3-VL模型与MNN推理引擎直接植入手机。所有原始音视频数据无需上传,完全依赖端侧语义提取,云端大模型可以安全、高效地“看懂”物理世界。

核心架构:为何选择端侧MCP?

想给AI装上一双“眼睛”,常规方案是把手机摄像头当作网络摄像头,通过RTSP协议将原始视频流实时推送到云端分析。这个方案的痛点很明显:成本高昂、算力需求大、还存在隐私泄露风险。

换个思路——让手机充当“本地大脑”。

直接在手机端部署一个多模态大模型,摄像头捕捉的画面、麦克风接收的声音,全都在本地实时转换成几KB的结构化文本(例如一段场景描述、一个异常状态列表),仅把最终的“结论”汇报给云端AI。这就是端侧语义提取的思路。

整套项目的数据流清晰简洁:

手机 (摄像头/麦克风) → 端侧分析(MNN+Qwen3-VL) → 结构化JSON → MCP Tool → Claude Code (或其他Agent)

为了让云端AI能标准化、轻松地调用手机的能力,我们在App内部内置了一个MCP服务。你可以把它理解为AI世界中的“标准USB-C接口”——无需复杂的抓包操作,也不用自建WebSocket桥接,云端一行命令就能安全、无缝地接入手机的感知能力。

我们需要做什么?如何实现?

实现路径并不复杂:

  • 构建一个Android App,在其中内置MCP Server;
  • 接入MNN端侧推理引擎,让Android设备能够利用ARM SoC指令集(例如SME2)高效运算;
  • 将预转换好的Qwen3-VL模型文件部署到手机本地;
  • 生成MCP鉴权信息,通过命令行在Claude Code中完成接入。

大家可以参考Demo中的代码,项目地址: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版本,如果需要其他版本,需自行编译并替换。

  • MNN-master/ 是编译JNI代码所必需的头文件目录,也就是MNN项目的源代码。若想更新MNN代码,下载新版本后替换该目录即可。

快速验证:打通MCP基础链路

先验证最小链路:让Claude Code通过局域网调用手机摄像头,确认端到端通路是否正常。

为降低验证复杂性,避免多变量同时干扰,这一步暂不接入大模型。App会自动降级走本地启发式(Heuristic)分析,返回一个degraded_mode: true的占位符。只要能看到这个响应,说明端到端通路已打通,后续接入Qwen3-VL模型就会非常顺畅。

  • 运行项目:在Android Studio中用Open打开工程的android-app/目录,等待Gradle同步完成后,直接点击Run即可安装到手机上。

  • 权限要求:首次启动时,请授予相机、麦克风和通知权限。特别提醒:Android 12及以上版本对后台摄像头访问限制严格,因此该App必须运行前台服务才能正常工作。

  • 启动服务:点击界面上的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调试,并确保手机和PC处于同一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.jsonllm.mnnllm.mnn.weightvisual.mnnvisual.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的完整绝对路径,务必确保文件结构完整。

端到端联调:验证完整能力

现在打开App,点击屏幕上的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查看屏幕上的错误码或跑马灯状态,实现大模型辅助硬件调试。甚至还能接入蓝牙舵机模拟按键操作,完成AI全自动硬件开发的闭环。

  • 3D打印保安:通过phone_watch_start开启周期性巡检。一旦本地模型识别到3D打印机出现“拉丝”或“炒面”(打印失败),立即通过SSE长连接主动通知桌面端Agent暂停打印并报警。

  • 居家隐私监控:将旧Android手机放在家里角落,所有图像和声音数据只在本地处理,云端大模型只接收结构化的文字总结。无需购买昂贵的云端摄像头,同时家庭隐私也得到完全保护。

借助这个示例,你可以尽情发挥想象力。结合Tailscale之类的组网工具,还能远程访问家里的设备,真正实现“千里眼、顺风耳”的AI智能感知。

来源:https://www.bestblogs.dev/article/6b9126ec?utm_source=rss&utm_medium=feed&utm_campaign=resources&entry=rss_article_item

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。