我想以编程方式拍摄我的应用程序的屏幕快照,出于某些原因(使用OpenGl SurfaceView命名),我不想使用通常使用的命名方法,例如使用视图绘图缓存。我使用adb测试了 screencap -p shell命令,它运行良好。但是,如果我使用以下代码从Xamarin Android应用中执行命令:
Java.Lang.Process process;
process = Java.Lang.Runtime.GetRuntime().Exec("screencap -p /sdcard/test.png");
process.WaitFor();
已创建test.png文件,但大小仅为12B,并且显然没有显示图像(只有带圆圈的!符号的灰色)。我没有root用户的设备(三星Galaxy Tab S3 btw),但是由于该命令是通过adb shell运行的,没有and su或root用户,因此我认为它也可以在应用程序中运行。
所以我的问题是:是否可以使用“ screencap -p” shell命令从未植根的设备上的应用程序中截取屏幕截图? 如果答案是肯定的,为什么我会遇到损坏的图像文件?可能是什么原因造成的?如何避免这种行为?
答案 0 :(得分:0)
有时候您必须完全限定屏幕截图,所以我相信您可以执行以下操作:
Java.Lang.Process process;
process = Java.Lang.Runtime.GetRuntime().Exec("/system/bin/screencap -p /sdcard/test.png");
process.WaitFor();
我基于一个示例Java类,该类可在GitHub here上查看。显然,只要适当,就可以将Java转换为Xamarin。
有趣的是,如果第一次尝试使用以下方法写失败,他们似乎会尝试获得sudo特权:
process = Runtime.getRuntime().exec("su");
答案 1 :(得分:0)
截屏时,我通过adb logcat
查看了设备日志。问题似乎是您需要Android权限“ READ_FRAME_BUFFER”。但是此权限仅适用于系统应用程序。因此,总而言之,我要说的是,在我没有生根设备的情况下,这是完全不可能的。对于有根设备,“ su”方法可能会起作用。