我知道如何截屏,但我想知道它是如何工作的。
至少从 Android 4.0 开始,你已经可以通过同时按住手机上的音量减小键和电源键来截屏,Android 会捕获当前屏幕并将其保存到 SD 卡中。
我只是想知道是否有人知道这是如何工作的,例如,它是在后台持续运行的服务,还是每个应用程序中内置的东西,或者 . 另外,它位于Android的源代码中的什么位置?
谢谢!
我知道如何截屏,但我想知道它是如何工作的。
至少从 Android 4.0 开始,你已经可以通过同时按住手机上的音量减小键和电源键来截屏,Android 会捕获当前屏幕并将其保存到 SD 卡中。
我只是想知道是否有人知道这是如何工作的,例如,它是在后台持续运行的服务,还是每个应用程序中内置的东西,或者 . 另外,它位于Android的源代码中的什么位置?
谢谢!
浏览源代码,我找到了侦听组合键并启动该过程的部分:
下面是具体代码:
如果您只想截取非常直接的屏幕截图:
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;
}
只需使用您想要快照的视图调用此方法。因此,如果您想要整个屏幕,只需传入您 top most ViewGroup
。如果您想要系统控件也只需调用:
screenShot((ViewGroup) view.getParent());
现在,如果您想知道“降低音量 + 电源键”在操作系统中的工作方式比您也可以访问的更深。无法从 APK AFAIK 拦截电源按钮。
我刚刚在源代码树中找到了代码:https ://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot
我想这只是通读它以更好地理解该过程的问题。
Android 应用程序使用意图来调用系统级资源。例如——大多数运行相机的软件都是由操作系统提供的。Android 操作系统基于 unix/linux 内核,因此使用相机看起来像这样。
当您拍摄屏幕截图时,这正是发生的事情。有一个进程正在运行来处理用户界面。它基本上坐下来等待输入和过滤任何应该由操作系统解释的东西,然后再通过管道传输到当前正在运行的应用程序。这是另一个 unix 约定,此时在我能想到的每个操作系统中都是标准的——管道输入流。它允许操作系统在传递给应用程序之前捕获更高优先级的输入,例如操作系统控制命令。(想想 Windows 中的 ctrl-alt-delete,或 unix 中的 ctrl-c/ctrl-z。)当屏幕截图键被按下时,这个上游 io 进程执行一个特殊的程序来拍摄屏幕截图(通过意图)和命令从未真正传递给“正在运行”的应用程序。该程序在新进程中执行(exec),构建屏幕位图,将它保存到画廊空间,然后死掉——所有这些都与调度程序处理时间共享异步进行,因此手机始终感觉“响应”。您在 John Bokers 中看到使用所有 gorp 回答源代码来实现这一点。