感谢项目 android_virtual_cam 为本项目提供的灵感和代码基础。
Android CamSwap 是一个基于 Xposed 框架的虚拟摄像头模块。它能够拦截 Android 系统相机的预览和拍照请求,并将预览画面替换为用户指定的视频。
本项目采用现代化的 Android 开发技术栈(Kotlin, Jetpack Compose)重构,并引入了基于 ContentProvider 的跨进程数据传输机制,兼容高版本 Android (11+) 的文件权限隔离。
旧版 v2.0 及之前版本的实现细节以历史提交为准,当前分支已完成重构与结构调整。
arm64-v8a。打开任意调用相机的应用,预览画面将被替换为你选择的视频。
提示:若视频画面方向不正确,可在通知栏使用旋转按钮微调,或在设置中手动填写旋转偏移角度。
模块的配置存储在以下路径(JSON 格式):
/sdcard/DCIM/Camera1/cs_config.json
目标视频文件也应放置在该目录下。模块重启后会自动读取。
Hook 层(Xposed 模块核心)采用模块化设计:
| 模块 | 文件 | 职责 |
|---|---|---|
| 入口 | HookMain.java |
Xposed 入口 + 共享状态 + 委托分发 |
| 播放器管理 | MediaPlayerManager.java |
6 组 MediaPlayer/GLVideoRenderer/SurfaceRelay 的生命周期 |
| 配置监听 | ConfigWatcher.java |
ContentObserver + FileObserver + BroadcastReceiver |
| Camera2 拦截 | Camera2SessionHook.java |
Camera2 session 创建拦截 + 虚拟 Surface 管理 |
| Camera2 Hook | Camera2Handler.java |
Camera2 CaptureRequest.Builder + Surface 替换 |
| Camera1 Hook | Camera1Handler.java |
Camera1 预览 Hook + onPreviewFrame 帧替换 |
| 音频 Hook | MicrophoneHandler.java |
AudioRecord 拦截 + MP3 音频替换 |
git clone https://github.com/zensu357/Android-CamSwap-OpenSource.git
cd Android-CamSwap-OpenSource
编译 Debug 包无需任何签名配置,直接运行:
./gradlew assembleDebug
如需编译已签名的 Release 包,在项目根目录创建 local.properties(勿提交到版本控制)并填写:
sdk.dir=/path/to/your/android/sdk
storeFile=../camswap_release.jks
storePassword=your_password
keyAlias=your_alias
keyPassword=your_key_password
若未配置签名,Release 构建会自动回退到 Debug 密钥签名,仍可正常安装。
# 编译 Release 包
./gradlew assembleRelease
编译产物位于 app/build/outputs/apk/ 目录下。
欢迎提交 Issue 和 Pull Request!
git checkout -b feature/AmazingFeaturegit commit -m 'Add some AmazingFeature'git push origin feature/AmazingFeature本项目仅供安全研究、软件测试和教育目的使用。
请勿将本项目用于任何非法用途(包括但不限于人脸识别绕过、身份欺诈等)。
使用者需自行承担因使用本项目而产生的一切法律责任。
如果本项目对你有帮助,请点 ⭐ Star 支持!
本项目基于 GPL-3.0 license 开源。
io.github.zensu357.camswap
Release Type: Stable
3/14/2026, 4:58:22 AM
io.github.zensu357.camswap 仓库初始化与模块上架所需元数据配置。arm64-v8a、armeabi-v7a、x86_64 三个 ABI 的 release APK,推荐大多数设备安装 arm64-v8a 版本。