App Inventor 2 摄像头拍照完整教程

覆盖:Camera拍照、ImagePicker选图、图片预览、保存相册、百度人脸识别。

一、Camera 拍照

1.1 基本拍照

// 拍照按钮
当 按钮_拍照.被点击 时
  调用 摄像头1.拍照

// 拍照完成
当 摄像头1.拍照完成 时(图片路径)
  // 显示预览
  设置 图片1.图片 = 图片路径
  设置 标签_路径.文本 = 图片路径
  
  // 保存路径供后续使用
  设置 全局变量 当前图片路径 = 图片路径

1.2 拍照后自动上传

初始化全局变量 当前图片路径 = ""

当 摄像头1.拍照完成 时(图片路径)
  设置 全局变量 当前图片路径 = 图片路径
  设置 图片1.图片 = 图片路径
  
  // 自动上传
  调用 对话框1.显示进度对话框("上传中...", "请稍候")
  调用 上传图片(图片路径)

定义 上传图片(路径)
  // 读取为Base64
  调用 文件工具1.读取文件为Base64(路径)

当 文件工具1.读取完成 时(Base64文本)
  设置 Web客户端1.URL = "https://api.example.com/upload"
  调用 Web客户端1.构建请求数据(
    ["image", "user_id"],
    [Base64文本, 全局变量 当前用户ID]
  )
  调用 Web客户端1.发送POST请求

当 Web客户端1.获得文本 时(URL, 响应码, 响应类型, 响应内容)
  调用 对话框1.关闭进度对话框
  如果 响应码 = 200 则
    初始化局部变量 结果 = 调用 字典.JSON转字典(响应内容)
    初始化局部变量 图片URL = 获取键的值(结果, "url", "")
    调用 对话框1.显示警告("✅ 上传成功")
  否则
    调用 对话框1.显示消息对话框("上传失败", "错误", "确定")

二、ImagePicker 从相册选图

2.1 基本用法

// 打开相册选图
当 按钮_选图.被点击 时
  调用 图片选择器1.打开

// 选图完成
当 图片选择器1.选择完成 时
  初始化局部变量 图片路径 = 图片选择器1.选中图片
  设置 图片1.图片 = 图片路径
  设置 全局变量 当前图片路径 = 图片路径

2.2 拍照+选图二选一

// 弹出选择方式
当 按钮_添加图片.被点击 时
  调用 对话框1.显示选择对话框(
    "请选择图片来源",
    "添加图片",
    "📷 拍照",
    "🖼 从相册选择",

  )

当 对话框1.选择完成后 时(选择)
  如果 选择 = "📷 拍照" 则
    调用 摄像头1.拍照
  否则如果 选择 = "🖼 从相册选择" 则
    调用 图片选择器1.打开

当 摄像头1.拍照完成 时(图片路径)
  调用 处理选中图片(图片路径)

当 图片选择器1.选择完成 时
  调用 处理选中图片(图片选择器1.选中图片)

定义 处理选中图片(路径)
  设置 图片1.图片 = 路径
  设置 全局变量 当前图片路径 = 路径
  设置 按钮_上传.启用 = 真

三、保存图片到相册

// 拍照后保存到系统相册
当 按钮_保存相册.被点击 时
  如果 全局变量 当前图片路径 = "" 则
    调用 对话框1.显示警告("请先拍照")
    返回
  
  // 生成目标路径
  初始化局部变量 文件名 = 合并字符串(
    "IMG_",
    调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyyMMdd_HHmmss"),
    ".jpg"
  )
  初始化局部变量 目标路径 = 合并字符串(
    "/storage/emulated/0/Pictures/", 文件名
  )
  
  // 复制文件
  调用 文件工具1.复制文件(全局变量 当前图片路径, 目标路径)

当 文件工具1.复制完成 时(成功)
  如果 成功 则
    // 通知媒体库扫描(让相册App能看到)
    调用 活动启动器1.启动活动
      动作 = "android.intent.action.MEDIA_SCANNER_SCAN_FILE"
      数据URI = 合并字符串("file://", 目标路径)
    调用 对话框1.显示警告("✅ 已保存到相册")
  否则
    调用 对话框1.显示消息对话框("保存失败", "错误", "确定")

四、百度人脸识别

4.1 接入流程

  1. 注册百度AI开放平台,创建应用
  2. 获取 API_KEYSECRET_KEY
  3. 调用接口获取 access_token
  4. 将图片Base64后调用人脸检测API

4.2 代码块

初始化全局变量 百度TOKEN = ""

// 第一步:获取Token(App启动时调用一次)
当 Screen1.初始化 时
  设置 Web客户端_百度.URL = 合并字符串(
    "https://aip.baidubce.com/oauth/2.0/token",
    "?grant_type=client_credentials",
    "&client_id=你的API_KEY",
    "&client_secret=你的SECRET_KEY"
  )
  调用 Web客户端_百度.发送POST文本("")

当 Web客户端_百度.获得文本 时(URL, 响应码, 响应类型, 响应内容)
  如果 在文本中查找(URL, "oauth") > 0 则
    初始化局部变量 结果 = 调用 字典.JSON转字典(响应内容)
    设置 全局变量 百度TOKEN = 获取键的值(结果, "access_token", "")

// 第二步:拍照后人脸识别
当 摄像头1.拍照完成 时(图片路径)
  设置 图片1.图片 = 图片路径
  调用 文件工具1.读取文件为Base64(图片路径)

当 文件工具1.读取完成 时(Base64文本)
  // 调用人脸检测API
  设置 Web客户端_百度.URL = 合并字符串(
    "https://aip.baidubce.com/rest/2.0/face/v3/detect",
    "?access_token=", 全局变量 百度TOKEN
  )
  调用 Web客户端_百度.构建请求数据(
    ["image", "image_type", "face_field"],
    [Base64文本, "BASE64", "age,gender,beauty,expression"]
  )
  调用 Web客户端_百度.发送POST请求

// 解析人脸识别结果
当 Web客户端_百度.获得文本 时(URL, 响应码, 响应类型, 响应内容)
  如果 在文本中查找(URL, "face") > 0 则
    初始化局部变量 结果 = 调用 字典.JSON转字典(响应内容)
    初始化局部变量 错误码 = 获取键的值(结果, "error_code", -1)
    
    如果 错误码 = 0 则
      初始化局部变量 人脸列表 = 获取键路径的值(结果, ["result", "face_list"], [])
      如果 列表长度(人脸列表) > 0 则
        初始化局部变量 人脸 = 选择列表项(人脸列表, 1)
        初始化局部变量 年龄 = 获取键路径的值(人脸, ["age", "value"], 0)
        初始化局部变量 性别 = 获取键路径的值(人脸, ["gender", "type"], "")
        初始化局部变量 颜值 = 获取键路径的值(人脸, ["beauty", "value"], 0)
        
        设置 标签_结果.文本 = 合并字符串(
          "年龄:约", 四舍五入(年龄), "岁\n",
          "性别:", 如果 性别="male" 则 "男" 否则 "女", "\n",
          "颜值:", 四舍五入(颜值), "分"
        )
      否则
        调用 对话框1.显示警告("未检测到人脸")
    否则
      调用 对话框1.显示警告("识别失败,请重试")

五、常见问题

Q1:拍照后图片路径是什么格式?

返回的是绝对路径,如 /data/user/0/com.xxx/files/Camera/photo_xxx.jpg

Q2:从相册选图后图片很大,上传慢?

拍照前设置摄像头分辨率(部分手机支持),或上传前压缩图片(需要扩展)。

Q3:百度人脸识别返回222207错误?

图片质量不够,人脸太小或模糊。建议:
  • 确保人脸占图片面积的1/4以上
  • 光线充足
  • 正面拍摄

Q4:ImagePicker在Android 13+无法打开?

需要在App权限中声明 READ_MEDIA_IMAGES 权限(Android 13+替代了旧的存储权限)。

参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。