Android如何截图?

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

至less从Android 4.0开始,您可以通过按住手机上的音量降低键+电源键来拍摄屏幕截图,Android将捕获当前屏幕并将其保存到SD卡。

我只是想知道,如果有人知道这是如何工作的,如果它是一个服务不断在后台运行,或内置到每个应用程序,或。 另外,它位于Android的源代码?

谢谢!

Solutions Collecting From Web of "Android如何截图?"

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

  1. 应用程序/进程决定它要使用相机。
  2. 该应用程序/进程build立一个意图,并将其传递给操作系统。
  3. 意图由操作系统进行处理,并在新的过程中执行相机软件(执行)。 调用进程可以阻止它,如果它同步调用意图,或者它可以asynchronous运行,调用应用程序和意图调用的应用程序可以同时运行。 在相机的例子中,它可能会被同步调用并阻止。
  4. 相机进程被用户用来拍照。
  5. 相机进程退出并产生错误或图片。
  6. 操作系统执行一些ipc(进程间通信)将图片传回给调用进程。 根据应用程序调用的意图types,使用pipe道或消息传递的select留给OS。 相机可能会使用消息传递,因为父进程在subprocess运行时被阻塞。
  7. 现在阻止等待意图返回的调用进程被OS唤醒并返回到运行状态。
  8. 图片已经返回到调用应用程序,因为它可以按照自己的意愿使用。

当你拍摄一个屏幕截图时,这正是发生的事情。 有一个进程正在运行来处理用户界面。 它基本上是等待input和过滤任何应该由操作系统解释的,然后再通过pipe道连接到当前正在运行的应用程序。 这是另一个unix约定,在这个点上,我认为每个操作系统都是标准的 – pipe道inputstream。 它允许操作系统在传送到应用程序之前捕捉更高优先级的input,例如操作系统控制命令。 (想想windows中的ctrl-alt-delete,或者unix中的ctrl-c / ctrl-z)。当按下屏幕快照键时,这个上游的io进程执行一个特殊的程序来通过意图进行屏幕截图,从来没有实际传递给“正在运行”的应用程序。 该程序在新进程中执行(exec),构build屏幕位图,将其保存到图库空间中,并且与处理时间共享的调度程序asynchronous,从而使手机始终处于“响应”状态。 你看到John Bokers回答了所有gorp的源代码来实现这个。

浏览源代码,我find了侦听密钥组合并启动进程的部分:

以下是特定的代码:

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

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

我想这只是一个阅读的问题,以更好地了解过程。

如果你只是想要一个非常简单的屏幕截图:

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中拦截电源button。