我想在C中执行屏幕截图命令"adb shell /system/bin/screencap -p /sdcard/img.png"
。我正在搜索相同的内容并获得a solution for another command并将命令修改为
execl("/system/bin/screencap", "-p", "storage/sdcard0/screenShot.png", (char *)NULL);
但是当我运行我的应用程序并调用上述命令的方法时,应用程序会崩溃。
如何修改“/system/bin/screencap -p /sdcard/img.png
”命令以从C代码运行。
汤姆回答后更新
应用程序再次关闭,这里是日志
06-21 11:52:01.488: I/WindowState(279): WIN DEATH: Window{40fed2c0 u0 com.mytest.ndktestapplication/com.mytest.ndktestapplication.MainActivity}
06-21 11:52:01.498: I/ActivityManager(279): Process com.mytest.ndktestapplication (pid 7745) has died.
06-21 11:52:01.498: W/ActivityManager(279): Force removing ActivityRecord{40ea9ab8 u0 com.mytest.ndktestapplication/.MainActivity}: app died, no saved state
答案 0 :(得分:3)
这是exec()系列函数的预期结果。
他们所做的是用当前程序替换指定的程序。再见应用程序。
为了避免你首先需要调用fork(),然后只在子代中调用exec(),如下所示:
if (!fork()) {
// fork() returned zero, so we are in the child
execl...
}
在调用exec函数之前,您可能还需要进行一些清理。
请注意,在大多数设备上,您无法从应用中截取屏幕截图,因为应用程序代码在用户ID下运行,而用户ID缺少相应的权限。但我似乎记得有些设备在未经许可的情况下运行的时间很短,因此可以检查这些功能。
答案 1 :(得分:1)
调用是
execl(path, arg0, arg1, ..., (char*) NULL);
第二个参数arg0
是程序被告知用来调用它的名称。给予该程序的实际参数仅从arg1
开始。
因此,您应该将代码更改为
execl("/system/bin/screencap", "screencap", "-p", "<pic>", (char *)NULL);