QSL4A 摄像头调用——Python 一行代码拍照
基本拍照
QSL4A 调用摄像头的最基本方式:
from androidhelper import Android
droid = Android()
# 调用系统相机 App 拍照
result = droid.takePicture("photo.jpg").result
print(result)
takePicture 会拉起 Android 系统自带的相机 App,用户手动按快门拍照后,照片会保存到指定路径(相对于 QPython 的工作目录,或绝对路径)。拍照完成后脚本才继续执行(阻塞等待)。
拍照方式的区别
调用系统相机(takePicture)
- 流程:脚本拉起相机 → 用户按快门 → 相机退出 → 脚本拿到照片路径
- 优点:利用系统相机的全部功能(滤镜、美颜、切换前后摄像头等),体验最好
- 缺点:需要用户手动操作,无法完全自动化
全自动拍照(部分版本支持)
部分 QSL4A 版本提供自动拍照 API,不需要用户按快门:
droid.cameraCapturePicture("auto_photo.jpg")
- 流程:脚本直接调用摄像头硬件,自动拍照并保存
- 优点:可以全自动,适合无人值守场景
- 缺点:可能不支持美颜等高级功能,部分机型兼容性不好
照片保存路径
takePicture 的参数是照片文件名或路径:
# 简单文件名:保存到 QPython 默认工作目录
droid.takePicture("test.jpg")
# 完整路径
droid.takePicture("/storage/emulated/0/Download/my_photo.jpg")
保存到公共目录(如 Download)需要存储权限,确认 QPython 已授予「管理所有文件」。
闪光灯控制
QSL4A 提供闪光灯独立控制 API:
# 开闪光灯
droid.toggleTorch(True)
# 拍照后关闪光灯
droid.takePicture("with_flash.jpg")
droid.toggleTorch(False)
或者直接在拍照时指定闪光灯模式(部分版本支持)。
录像(部分版本)
某些 QSL4A 版本提供录像 API:
droid.startRecordingVideo("video.mp4")
# 几秒后
droid.stopRecordingVideo()
录像功能不如拍照稳定,具体支持情况需要实际测试。
拍完后处理
照片保存后,可以直接用 Pillow 等库处理:
from PIL import Image
img = Image.open("photo.jpg")
# 压缩保存
img.thumbnail((800, 600))
img.save("photo_small.jpg")
或者用 QNotebook 展示:
from IPython.display import Image
Image(filename="photo.jpg")
权限需求
| API | 需要的权限 |
|---|---|
takePicture | 相机权限 + 存储写入权限 |
toggleTorch | 相机权限 |
| 自动拍照 | 相机权限 + 悬浮窗权限(部分机型) |
注意:Android 13+ 的相机权限是运行时申请的。如果第一次调用 takePicture 时 QPython 弹出权限请求,记得点「允许」。
常见问题
拍照后脚本卡住
某些手机的系统相机 App 和 QPython 之间的返回协议有兼容性问题。如果调用 takePicture 后脚本一直卡住不继续执行,尝试:
- 手动回到 QPython 界面(某些 ROM 需要手动切回去)
- 检查相机 App 是否真的退出了
- 保存路径是否有写入权限
拍出来的照片是倒的
部分机型返回的 EXIF 方向信息和实际不符。用 Pillow 处理时注意读取 EXIF 方向自动旋转。
小结
QSL4A 的摄像头 API 是 QPython 区别于 PC Python 的另一个杀手级功能。droid.takePicture() 一行代码就能调起系统相机并拿到照片,拍完可以直接用 Pillow 处理、用 Matplotlib 分析、用 QNotebook 展示。全自动拍照功能适合无人值守场景,但需要测试机型兼容性。
继续看 蓝牙与 NFC 了解近距离通信能力。