Android API26+自动化截图:应选用哪种存储API?
问题描述
我在应用的Debug版本上,通过instrumented tests(androidTest)结合UiAutomator与调用adb pull的shell脚本实现截图自动化。每完成一张截图后,需要在Android设备上找到一个满足以下条件的可写入图片的目录:
- 无需用户输入即可写入(如申请权限、文件选择器)
- 可通过ADB直接访问,无需特殊技巧(如
run-as,这类方法未来可能失效) - 无需在每台设备上进行配置操作(如root设备、安装特殊证书,新增设备时易出问题)
- 无需依赖第三方工具
- 仅需兼容Android API 26及以上版本(8.0+)
- 最好无需声明Manifest权限(非硬性要求)
Android官方的存储API选择文档针对生产应用的常规用户场景,未说明ADB是否可访问这些API。由于过去10年Android存储API多次重大变更,现有建议中过时内容较多,验证方案有效性成本较高。请问满足上述所有要求的存储API应选用哪一种?
解决方案
首选方案:应用专属外部存储目录
目录获取方式
在instrumented test代码中,通过Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)获取目标目录的File对象,路径格式通常为/sdcard/Android/data/[你的应用包名]/files/Pictures/。
符合要求的原因:
- 无需用户输入写入:API 26及以上版本中,应用对自身专属外部存储目录的读写无需申请
READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,也不会触发用户授权弹窗,可直接写入文件。 - ADB直接访问:该目录属于外部存储的公开可访问区域,可直接通过
adb pull /sdcard/Android/data/[你的应用包名]/files/Pictures/[截图文件名]命令拉取文件,无需run-as、root等特殊操作。 - 无需设备配置:所有API 26+的Android设备默认支持该目录的读写,不需要root设备、安装特殊证书或额外配置步骤。
- 无第三方工具依赖:仅依赖Android系统原生API和ADB命令即可完成流程,无需第三方工具支持。
- 兼容API 26+:该API从Android 4.4(API 19)就已提供,完全覆盖API 26及以上版本的要求。
- 无需Manifest权限:API 26+下无需在Manifest中声明任何存储权限,完全满足“最好无需权限”的要求。
备选方案:MediaStore.Images(公共图片目录)
适用场景
如果需要截图被系统相册识别,可以选择此方案,但相比应用专属外部存储,需注意权限差异:
- 写入权限:API 29(Android 10)及以上版本,写入公共媒体目录无需
WRITE_EXTERNAL_STORAGE权限,但需通过MediaStoreAPI插入内容,不能直接用File对象写入;API 26-28版本需要在Manifest中声明WRITE_EXTERNAL_STORAGE权限,不过可通过instrumented test的GrantPermissionRule自动授予,无需用户操作。 - ADB访问:公共图片目录(如
/sdcard/Pictures/)可直接通过ADB拉取,无特殊限制。 - 其余条件(无需设备配置、无第三方依赖、兼容API 26+)均满足。
总结
优先选择应用专属外部存储目录,它完全匹配你所有要求,实现成本最低且无权限相关的额外操作;若需截图被系统相册识别,再考虑MediaStore方案。
内容的提问来源于stack exchange,提问作者medavox
相关产品推荐
相关产品推荐

