SystemUI->截屏
来源:互联网 发布:五金计算软件下载 编辑:程序博客网 时间:2024/05/11 02:08
leadcore Android4.4
在PhoneWindowManager中处理组合键事件,原理:按下音量-时延迟响应事件,在这个延迟时间内如果power键也被按了,并且等两个按键按下的时间都超过一定值时就开始处理截屏流程。
private void takeScreenshot() { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { return; } ComponentName cn = new ComponentName("com.android.systemui", "com.android.systemui.screenshot.TakeScreenshotService"); Intent intent = new Intent(); intent.setComponent(cn); ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { synchronized (mScreenshotLock) { if (mScreenshotConnection != this) { return; } Messenger messenger = new Messenger(service); Message msg = Message.obtain(null, 1); final ServiceConnection myConn = this; Handler h = new Handler(mHandler.getLooper()) { @Override public void handleMessage(Message msg) { synchronized (mScreenshotLock) { if (mScreenshotConnection == myConn) { mContext.unbindService(mScreenshotConnection); mScreenshotConnection = null; mHandler.removeCallbacks(mScreenshotTimeout); } } } }; msg.replyTo = new Messenger(h); msg.arg1 = msg.arg2 = 0; if (mStatusBar != null && mStatusBar.isVisibleLw()) msg.arg1 = 1; if (mNavigationBar != null && mNavigationBar.isVisibleLw()) msg.arg2 = 1; try { messenger.send(msg); } catch (RemoteException e) { } } } @Override public void onServiceDisconnected(ComponentName name) {} }; if (mContext.bindServiceAsUser( intent, conn, Context.BIND_AUTO_CREATE, UserHandle.CURRENT)) { mScreenshotConnection = conn; mHandler.postDelayed(mScreenshotTimeout, 10000); } } }
接着通过com.android.systemui.screenshot.TakeScreenshotService里面的Handler接收消息调用GlobalScreenshot的takeScreenshot()开始截屏
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: final Messenger callback = msg.replyTo; if (mScreenshot == null) { mScreenshot = new GlobalScreenshot(TakeScreenshotService.this); } mScreenshot.takeScreenshot(new Runnable() { @Override public void run() { Message reply = Message.obtain(null, 1); try { callback.send(reply); //send intent to update Screenshot Folder Log.v(TAG,"send broadcast to filemanager to update ScreenShot"); Intent intent = new Intent(); intent.setAction(UPDATE_SCREENSHOT_FOLDER); sendBroadcast(intent); } catch (RemoteException e) { } } }, msg.arg1 > 0, msg.arg2 > 0); } } }; @Override public IBinder onBind(Intent intent) { return new Messenger(mHandler).getBinder(); }
以上可以看出,只要启动service就能调用截屏了。
截屏核心代码
// Take the screenshot mScreenBitmap = SurfaceControl.screenshot((int) dims[0], (int) dims[1]);
1 1
- SystemUI->截屏
- SystemUI
- SystemUI
- android systemui
- SystemUI 概述
- SystemUI 概述
- 打包systemUI
- Android: SystemUI
- SystemUI浅析
- systemui浅析
- systemui 分析
- SystemUI 布局
- systemUI学习
- SystemUI VolumeService
- SystemUI RingtonePlayer
- SystemUI 剖析
- android SystemUI浅析之SystemUI启动流程
- SystemUI之USB2(Framework UEvent -> SystemUI)
- struts2 下载
- Minix文件系统框架 http://www.cnblogs.com/zhangchaoyang/articles/1896605.html
- JavaEE 添加简单的日志过滤器
- git 删除文件
- NandFlash详述(下)
- SystemUI->截屏
- JVM启动参数详解
- Android批量打包-如何一秒内打完几百个apk渠道包
- head first python 读书笔记(十二)
- 【网络安全】XCodeGhost事件刨根问底
- css防止ul下的li换行(li超出宽度变成…)代码
- 转 Java集合框架的基本接口/类层次结构
- 协议Protocol
- 对代理的传值方式的深入理解以及使用