You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android测试中UiDevice.takeScreenshot()截图无法保存问题求助

问题根因
  • 核心错误是保存路径配置无效:UiDevice.takeScreenshot() 接收的File参数对应Android模拟器自身独立文件系统内的路径,你代码里写的C:\Users\me\Desktop\Screenshot_Pics是Windows宿主机的本地路径,模拟器运行的是Linux内核环境,不存在Windows盘符概念,根本无法识别该路径,自然写入失败。
  • 你之前排查的显卡渲染、存储权限配置都不是核心诱因:就算权限配置完全正确,路径不对也不可能保存成功;且如果目标测试版本是Android 10及以上,分区存储规则下WRITE_EXTERNAL_STORAGE权限本身就无法授权访问外部存储非专属目录。
修复步骤
  1. 先将截图保存到模拟器内测试应用可直接访问的专属目录,该目录不需要申请任何存储权限,测试进程默认有读写权限,修改后的测试代码如下:
@RunWith(AndroidJUnit4::class)
class ScreenshotTest : ScreenCaptureListener {
    private val device: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
    @get:Rule
    val activityRule = ActivityTestRule(MainActivity::class.java, true)

    @Test
    fun testScreenshot(){
        // 获取测试应用在模拟器上的专属外部存储路径
        val appExternalDir = InstrumentationRegistry.getInstrumentation().targetContext.getExternalFilesDir(null)
        val screenshotFile = File(appExternalDir, "pic.png")
        val saveSuccess = device.takeScreenshot(screenshotFile)
        // 加断言快速判断截图是否在模拟器内保存成功
        assert(saveSuccess) { "模拟器内截图保存失败" }
    }
}
  1. 把模拟器内存储的截图文件拉取到你电脑本地桌面,直接用adb命令执行即可:
    adb pull /sdcard/Android/data/替换成你的测试应用包名/files/pic.png C:\Users\me\Desktop\Screenshot_Pics\

额外说明:你之前写的grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)权限规则在Android 13及以上版本已经完全失效,该权限在高版本系统中已被废弃,存储到应用专属目录不需要该权限,可以直接删掉这条规则避免兼容问题。如果需要直接在测试流程里把文件同步到电脑本地,也可以在截图保存成功后,通过测试服务的文件传输通道把截图文件写到宿主机指定路径。

内容的提问来源于stack exchange,提问作者Big Papa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:12:22