App Inventor 2 文件操作完整教程

覆盖:Android存储路径、查找文件、读写文件、拷贝到相册、FileTools扩展。

一、Android存储路径基础(必读)

1.1 三种路径类型

路径类型示例特点
私有目录/data/user/0/com.xxx/files/App专属,无需权限,卸载删除
ASD目录/storage/emulated/0/Android/data/com.xxx/files/外部私有,无需权限,卸载删除
公共目录/storage/emulated/0/Download/所有App可访问,需要权限

1.2 ⚠️ 高版本安卓(Android 10+)的变化

  • Android 10+ 限制访问公共目录,需要 READ/WRITE_EXTERNAL_STORAGE 权限
  • Android 11+ 进一步限制,推荐使用 ASD目录MediaStore API
  • 最佳实践:优先使用ASD目录,避免权限问题

1.3 获取ASD路径

// 使用FileTools扩展获取ASD路径
初始化局部变量 ASD路径 = 调用 FileTools1.获取ASD路径
// 结果:/storage/emulated/0/Android/data/com.你的包名/files/

二、文件组件基础操作

2.1 写入文件

// 写入文本到文件(覆盖)
调用 文件1.保存文件
  文本 = "Hello, World!"
  文件名 = "/mydata.txt"    // 相对路径,存到私有目录

// 追加内容到文件
调用 文件1.追加到文件
  文本 = "\n新增一行"
  文件名 = "/mydata.txt"

2.2 读取文件

// 读取文件内容
调用 文件1.读取文件("/mydata.txt")

当 文件1.获得文本 时(文本)
  设置 标签1.文本 = 文本

2.3 删除文件

调用 文件1.删除文件("/mydata.txt")

三、FileTools扩展(推荐)

FileTools 扩展提供更强大的文件操作能力,封装了ASD路径,无需手动处理权限。

3.1 核心方法

方法说明
获取ASD路径返回App的ASD目录路径
文件是否存在(路径)检查文件是否存在
复制文件(源, 目标)复制文件
移动文件(源, 目标)移动文件
删除文件(路径)删除文件
列出目录文件(路径)列出目录下所有文件
创建目录(路径)创建目录
获取文件名(路径)从路径提取文件名
获取文件大小(路径)获取文件大小(字节)

3.2 查找手机上的文件

// 列出ASD目录下所有文件
当 按钮_查找.被点击 时
  初始化局部变量 ASD = 调用 FileTools1.获取ASD路径
  初始化局部变量 文件列表 = 调用 FileTools1.列出目录文件(ASD)
  
  设置 标签_文件列表.文本 = ""
  对于 每个 文件 在 文件列表 中
    设置 标签_文件列表.文本 = 合并字符串(
      标签_文件列表.文本, 文件, "\n"
    )

// 查找特定类型文件(如所有图片)
定义 查找图片文件(目录)
  初始化局部变量 所有文件 = 调用 FileTools1.列出目录文件(目录)
  初始化局部变量 图片列表 = []
  
  对于 每个 文件 在 所有文件 中
    如果 以 ".jpg" 结尾(文件) 或 以 ".png" 结尾(文件) 则
      调用 追加列表项(图片列表, 文件)
  
  返回 图片列表

3.3 创建指定文件路径

// 在ASD目录下创建子目录
当 按钮_创建目录.被点击 时
  初始化局部变量 ASD = 调用 FileTools1.获取ASD路径
  初始化局部变量 新目录 = 合并字符串(ASD, "photos/2026-03/")
  
  如果 调用 FileTools1.文件是否存在(新目录) = 假 则
    调用 FileTools1.创建目录(新目录)
    调用 对话框1.显示消息对话框("目录创建成功:" + 新目录, "提示", "确定")
  否则
    调用 对话框1.显示消息对话框("目录已存在", "提示", "确定")

四、拍照并保存到相册

4.1 问题说明

App Inventor 2 拍照后,图片默认保存在App私有目录,相册App看不到 要让图片出现在相册,需要:
  1. 将图片复制到公共目录(如 Pictures/
  2. 通知系统媒体库扫描新文件

4.2 代码块

初始化全局变量 最新照片路径 = ""

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

当 摄像头1.拍照完成 时(图片路径)
  设置 全局变量 最新照片路径 = 图片路径
  设置 图片1.图片 = 图片路径

// 保存到相册
当 按钮_保存相册.被点击 时
  如果 全局变量 最新照片路径 ≠ "" 则
    // 生成目标路径(公共Pictures目录)
    初始化局部变量 文件名 = 合并字符串(
      "photo_",
      调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyyMMdd_HHmmss"),
      ".jpg"
    )
    初始化局部变量 目标路径 = 合并字符串(
      "/storage/emulated/0/Pictures/", 文件名
    )
    
    // 复制文件
    调用 FileTools1.复制文件(全局变量 最新照片路径, 目标路径)

当 FileTools1.复制完成 时(成功)
  如果 成功 则
    // ⚠️ 重要:通知媒体库扫描(否则相册不显示)
    调用 FileTools1.扫描媒体文件(目标路径)
    调用 对话框1.显示消息对话框("✅ 已保存到相册", "提示", "确定")
  否则
    调用 对话框1.显示消息对话框("❌ 保存失败", "错误", "确定")

4.3 ⚠️ 息屏后相册不显示的问题

原因扫描媒体文件 在某些手机上需要重启才生效。 解决方案
// 方案1:使用MediaStore API(需要扩展)
调用 MediaStore1.插入图片(目标路径)

// 方案2:发送广播通知系统扫描
调用 活动启动器1.启动活动
  动作 = "android.intent.action.MEDIA_SCANNER_SCAN_FILE"
  数据URI = 合并字符串("file://", 目标路径)

五、文件读写实战:本地日志系统

初始化全局变量 日志文件 = "/app_log.txt"

// 写入日志
定义 写日志(内容)
  初始化局部变量 时间 = 调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyy-MM-dd HH:mm:ss")
  调用 文件1.追加到文件
    文本 = 合并字符串("[", 时间, "] ", 内容, "\n")
    文件名 = 全局变量 日志文件

// 读取日志
当 按钮_查看日志.被点击 时
  调用 文件1.读取文件(全局变量 日志文件)

当 文件1.获得文本 时(文本)
  设置 文本框_日志.文本 = 文本

// 清空日志
当 按钮_清空日志.被点击 时
  调用 文件1.删除文件(全局变量 日志文件)
  设置 文本框_日志.文本 = ""

六、常见问题

Q1:文件路径怎么写?

// 私有目录(推荐,无需权限)
"/myfile.txt"                    // 相对路径,存到私有目录

// ASD目录(推荐,无需权限)
调用 FileTools1.获取ASD路径 + "myfile.txt"

// 公共目录(需要权限,Android 10+受限)
"/storage/emulated/0/Download/myfile.txt"

Q2:读取文件返回空?

  • 检查文件路径是否正确
  • 确认文件已存在(用 FileTools1.文件是否存在 检查)
  • 注意路径格式:私有目录用相对路径,ASD用绝对路径

Q3:保存到相册后重启才显示?

使用 活动启动器 发送媒体扫描广播(见第四节方案2)。

Q4:Android 11+ 无法访问外部存储?

  • 优先使用ASD目录(无需权限)
  • 如必须访问公共目录,在AndroidManifest中声明 MANAGE_EXTERNAL_STORAGE 权限(需要Google审核)

参考资料


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

参考资料与版权声明

原文来源

版权声明

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