Android测试中UiDevice.takeScreenshot()截图无法保存问题求助
问题根因
- 核心错误是保存路径配置无效:
UiDevice.takeScreenshot()接收的File参数对应Android模拟器自身独立文件系统内的路径,你代码里写的C:\Users\me\Desktop\Screenshot_Pics是Windows宿主机的本地路径,模拟器运行的是Linux内核环境,不存在Windows盘符概念,根本无法识别该路径,自然写入失败。 - 你之前排查的显卡渲染、存储权限配置都不是核心诱因:就算权限配置完全正确,路径不对也不可能保存成功;且如果目标测试版本是Android 10及以上,分区存储规则下
WRITE_EXTERNAL_STORAGE权限本身就无法授权访问外部存储非专属目录。
修复步骤
- 先将截图保存到模拟器内测试应用可直接访问的专属目录,该目录不需要申请任何存储权限,测试进程默认有读写权限,修改后的测试代码如下:
@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) { "模拟器内截图保存失败" } } }
- 把模拟器内存储的截图文件拉取到你电脑本地桌面,直接用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
相关产品推荐
相关产品推荐

