目标: 在设备上进行自动测试期间拍摄屏幕截图。测试完成后,使用adb拉取屏幕截图文件。
背景:
我目前正在尝试编写自动化测试来拍摄设备屏幕的快照。使用UiDevice进行导航,我想在测试过程中截取屏幕截图。 UiDevice有一个方法takeScreenshot,当我想要快照时,我会调用它。
经过一番调查后,我意识到负责将图像写入文件UiAutomatorBridge的类会遇到异常:
java.io.FileNotFoundException: /data/local/tmp/screenshots/screen2.png:打开失败:EACCES (许可被拒绝)
使用adb,我创建了该文件并为所有用户设置了所有权限。
adb shell touch /data/local/tmp/screenshots/screen1.png
adb shell chmod 777 /data/local/tmp/screenshots
完成后,我可以截取屏幕截图:
@Test
public void takeSnapShot() {
String filename = "/data/local/tmp/screenshots/screen1.png";
File file = new File(filename);
assertEquals(true, mDevice.takeScreenshot(file));
}
问题:
我希望能够在测试执行时直接创建文件,而无需使用adb。 我尝试使用createNewFile直接从Java创建文件。
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
但是我得到了一个IOException
java.io.IOException:open failed:EACCES(Permission denied)
有谁知道发生了什么?我对Linux很陌生,所以即使看起来很明显,也不要犹豫不决;)
我应该在superuser上发布此内容吗?
修改
目录 / data 具有这些权限
drwxrwx--x system system 2016-01-14 14:03 data
我无法列出 / data 的内容,这让我相信用户" shell"不属于该组"系统"。我无法列出 / data / local 的内容。
但是, / data / local / tmp 归" shell"所有。
drwxrwx--x shell shell 2016-01-14 12:20 . (tmp)
/ data / local / tmp 为所有用户提供+ x权限。
最后,目录"截图"属于具有权限777的shell。
drwxrwxrwx shell shell 2016-01-14 11:46 screenshots
据我了解,任何用户都应该能够访问 / data / local / tmp / screenshots
答案 0 :(得分:1)
使用Environment.getExternalStorageDirectory()
而不是在 / data / local / tmp / 下保存。
您需要读/写权限才能执行此操作。您必须将这两行添加到应用程序的清单中! (我尝试将这些行添加到/androidTest/Manifest.xml文件中,但它没有任何效果。)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
虽然它解决了查找保存/读取屏幕截图的公共目录的问题,但它也带来了一个新的。
如果你已经拥有它们,那么必须添加这两个权限并不是什么大问题。但是,如果您不想要求用户提供这些权限,则每次测试/签署应用程序时都必须添加/删除这些行,这远非理想。
编辑:
在this post中,有人建议使用构建差异(调试,发布)来拥有两个不同的清单。
最后,我有3个清单:
工具:overrideLibrary =&#34; android.support.test.uiautomator.v18&#34;