我知道如何截取屏幕截图,但我想知道它是如何工作的。
至少从Android 4.0开始,您可以通过按住手机上的音量减小+电源键来拍摄屏幕截图,Android将捕获当前屏幕并将其保存到SD卡。
我只是想知道是否有人知道这是如何工作的,例如,如果它是在后台持续运行的服务,或者每个应用程序内置的东西,或者。此外,它位于Android的源代码中的哪个位置?
谢谢!
答案 0 :(得分:9)
浏览sourcecode我找到了侦听组合键的部分并启动了该过程:
以下是具体代码:
答案 1 :(得分:6)
如果您只想拍摄非常直接的截屏:
public Bitmap screenShot(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
view.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
只需使用您想要快照的视图调用此方法..所以,如果您希望整个屏幕只传递到最顶层的ViewGroup
。如果你想要系统控件也只需要调用:
screenShot((ViewGroup) view.getParent());
现在,如果您想知道“音量降低+电源键”的工作原理是如何在操作系统中更深入,而不是您也可以访问。无法拦截APK AFAIK的电源按钮。
答案 2 :(得分:6)
我刚刚在源代码树中找到了代码:https://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot
我想这只是通过阅读来更好地理解这个过程的问题。
答案 3 :(得分:1)
Android应用程序使用意图来调用系统级资源。例如,运行摄像机的大多数软件都是由操作系统提供的。 Android操作系统基于unix / linux内核,所以使用相机会是这样的。
当您拍摄屏幕截图时,这正是发生的事情。有一个进程正在运行以处理用户界面。它基本上位于等待输入和过滤器,用于操作系统在传送到当前运行的应用程序之前应解释的任何内容。这是另一个unix约定,在这一点上,我能想到的每个操作系统都是标准的 - 管道输入流。它允许操作系统在传递给应用程序之前捕获更高优先级的输入,例如OS控制命令。 (想想在windows中使用ctrl-alt-delete,或在unix中使用ctrl-c / ctrl-z。)当按下屏幕截图键时,这个上游io进程会执行一个特殊程序来拍摄屏幕截图(通过意图)和命令永远不会传递给'running'应用程序。该程序在一个新进程中执行(exec),构建一个屏幕位图,将其保存到图库空间,然后死掉 - 所有这些都与处理时间共享的调度程序异步,因此手机始终感觉“响应”。您可以在John Bokers中看到所有gorp的源代码,以实现此目的。