7

我知道如何截屏,但我想知道它是如何工作的。

至少从 Android 4.0 开始,你已经可以通过同时按住手机上的音量减小键和电源键来截屏,Android 会捕获当前屏幕并将其保存到 SD 卡中。

我只是想知道是否有人知道这是如何工作的,例如,它是在后台持续运行的服务,还是每个应用程序中内置的东西,或者 . 另外,它位于Android的源代码中的什么位置?

谢谢!

4

4 回答 4

9

浏览源代码,我找到了侦听组合键并启动该过程的部分:

下面是具体代码:

http://androidxref.com/4.1.1/xref/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java#3270

于 2012-11-01T16:02:02.630 回答
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;
}

只需使用您想要快照的视图调用此方法。因此,如果您想要整个屏幕,只需传入您 top most ViewGroup。如果您想要系统控件也只需调用:

screenShot((ViewGroup) view.getParent());

现在,如果您想知道“降低音量 + 电源键”在操作系统中的工作方式比您也可以访问的更深。无法从 APK AFAIK 拦截电源按钮。

于 2012-11-01T16:04:47.223 回答
6

我刚刚在源代码树中找到了代码:https ://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot

我想这只是通读它以更好地理解该过程的问题。

于 2012-11-01T16:06:42.897 回答
1

Android 应用程序使用意图来调用系统级资源。例如——大多数运行相机的软件都是由操作系统提供的。Android 操作系统基于 unix/linux 内核,因此使用相机看起来像这样。

  1. 应用程序/进程决定它要使用相机。
  2. 该应用程序/进程构建一个意图并将其传递给操作系统。
  3. 意图由操作系统处理,相机软件在新进程中执行(exec)。调用进程可以在同步调用 Intent 时阻止它,或者它可以异步运行,调用应用程序和 Intent 调用的应用程序可以同时运行。在相机的示例中,它可能会被同步调用并阻塞。
  4. 用户使用相机进程来拍照。
  5. 相机进程退出并产生错误或图片。
  6. 操作系统执行一些 ipc(进程间通信)以将图片传递回调用进程。根据应用程序调用的意图类型,使用管道或消息传递的选择留给操作系统。相机可能会使用消息传递,因为父进程在子进程运行时被阻塞。
  7. 现在阻塞等待返回意图的调用进程被操作系统唤醒并返回到运行状态。
  8. 图片已返回给调用应用程序,供其使用。

当您拍摄屏幕截图时,这正是发生的事情。有一个进程正在运行来处理用户界面。它基本上坐下来等待输入和过滤任何应该由操作系统解释的东西,然后再通过管道传输到当前正在运行的应用程序。这是另一个 unix 约定,此时在我能想到的每个操作系统中都是标准的——管道输入流。它允许操作系统在传递给应用程序之前捕获更高优先级的输入,例如操作系统控制命令。(想想 Windows 中的 ctrl-alt-delete,或 unix 中的 ctrl-c/ctrl-z。)当屏幕截图键被按下时,这个上游 io 进程执行一个特殊的程序来拍摄屏幕截图(通过意图)和命令从未真正传递给“正在运行”的应用程序。该程序在新进程中执行(exec),构建屏幕位图,将它保存到画廊空间,然后死掉——所有这些都与调度程序处理时间共享异步进行,因此手机始终感觉“响应”。您在 John Bokers 中看到使用所有 gorp 回答源代码来实现这一点。

于 2012-11-01T16:17:30.417 回答