【发布时间】:2016-04-19 18:24:31
【问题描述】:
目标: 在设备上进行自动测试期间截取屏幕截图。测试完成后使用 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:打开失败:EACCES(权限被拒绝)
有人知道发生了什么吗?我对 Linux 还很陌生,所以即使你觉得很明显,也不要犹豫提出建议;)
我应该把它发到superuser 上吗?
编辑
目录/data有这些权限
drwxrwx--x system system 2016-01-14 14:03 data
我无法列出/data 的内容,这让我相信用户“shell”不属于“system”组。我也无法列出 /data/local 的内容。
但是,/data/local/tmp 归“shell”所有。
drwxrwx--x shell shell 2016-01-14 12:20 . (tmp)
/data/local/tmp 向所有用户授予 +x 权限。
最后,“screenshots”目录属于权限为777的shell。
drwxrwxrwx shell shell 2016-01-14 11:46 screenshots
据我了解,任何用户都应该能够访问 /data/local/tmp/screenshots
【问题讨论】:
-
我认为您不应该创建一个稍后将被快照图像覆盖的空文件。您只需要确保您为输出指定的目录可被进程写入。
-
谢谢。我不是 Linux 专家。我认为将目录权限设置为 777 足以让用户向其中添加文件。不正确吗?您知道允许用户在目录中创建文件所需的所有条件吗?
-
没错,但您创建了文件。我认为你应该 chmod 目录。但是您还需要确保所有父目录也有 r+x 供用户使用。 /data /data/local /data/local/tmp /data/local/tmp/screenshots
-
我编辑了我的帖子以便为您提供更多信息。谢谢你的回答。
-
你能再尝试一件事吗:我猜你想运行的代码不在用户 shell 下运行。让我们试着弄清楚。假设在 shomewhere(不知道在哪里)创建一个空文件,然后用 ls 查看它。
标签: android linux file-permissions android-uiautomator