(1)Framework层Flow

Framework层的backtrace如下:

07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:  at com.android.server.statusbar.StatusBarManagerService$1.onCameraLaunchGestureDetected(StatusBarManagerService.java:268)
07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:     at com.android.server.GestureLauncherService.handleCameraGesture(GestureLauncherService.java:432)
07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:     at com.android.server.GestureLauncherService.interceptPowerKeyDown(GestureLauncherService.java:390)
07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:     at com.android.server.policy.PhoneWindowManager.interceptPowerKeyDown(PhoneWindowManager.java:1117)
07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:     at com.android.server.policy.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:4688)
07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:     at com.android.server.wm.InputManagerCallback.interceptKeyBeforeQueueing(InputManagerCallback.java:318)
07-02 16:17:25.556  1066  2879 E dxf_onCameraLaunchGestureDetected:     at com.android.server.input.InputManagerService.interceptKeyBeforeQueueing(InputManagerService.java:1981)07-02 16:17:25.560  3058  3058 D StatusBar: Finish going to sleep before launching camera

最原始的事件触发从InputManagerService开始:

//frameworks/base/services/core/java/com/android/server/input/InputManagerService.java// Native callback.private int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {return mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);}

最终调用到StatusBarManagerService这里:

//frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java@Overridepublic void onCameraLaunchGestureDetected(int source) {if (mBar != null) {try {android.util.Log.e("dxf_onCameraLaunchGestureDetected", "source = " + source,new NullPointerException());mBar.onCameraLaunchGestureDetected(source);} catch (RemoteException e) {}}}

上面Framework层的逻辑如果不清楚,可以根据backtrace来追踪Code查看Flow,这里将重点的Power键单双击事件写成另外一篇文章,可以参考一下Framework层长短按Power键触发事件。

接下来这里即将调用到SystemUI当中的StatusBar当中。

//vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.javapublic void onCameraLaunchGestureDetected(int source) {android.util.Log.e("dxf_onCameraLaunchGestureDetected", "source = " + source,new NullPointerException());mLastCameraLaunchSource = source;if (isGoingToSleep()) {if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Finish going to sleep before launching camera");//这里将变量mLaunchCameraOnFinishedGoingToSleep设置为true,等到后续用于判断FlowmLaunchCameraOnFinishedGoingToSleep = true;return;}if (!mNotificationPanelViewController.canCameraGestureBeLaunched()) {if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Can't launch camera right now");return;}if (!mDeviceInteractive) {mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_CAMERA_LAUNCH,"com.android.systemui:CAMERA_GESTURE");}vibrateForCameraGesture();if (source == StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) {Log.i(TAG, "Camera launch");mKeyguardUpdateMonitor.onCameraLaunched();}//...
}

从Log可以看到第一次的调用都被第一个if语句拦截住了,开始执行isGoingToSleep()。

(2)SystemUI中的Flow

从上面第一次进入onCameraLaunchGestureDetected后,被判断条件拦截,进而后续又重新回调如下函数,准备重新OpenCamera。

07-02 16:17:25.646  3058  3058 E dxf_onCameraLaunchGestureDetected:  at com.android.systemui.statusbar.phone.StatusBar.onCameraLaunchGestureDetected(StatusBar.java:4162)
07-02 16:17:25.646  3058  3058 E dxf_onCameraLaunchGestureDetected:     at com.android.systemui.statusbar.phone.StatusBar$12.lambda$onFinishedGoingToSleep$0(StatusBar.java:4027)
07-02 16:17:25.646  3058  3058 E dxf_onCameraLaunchGestureDetected:     at com.android.systemui.statusbar.phone.StatusBar$12.lambda$onFinishedGoingToSleep$0$StatusBar$12(Unknown Source:0)
//vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.javafinal WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() {@Overridepublic void onFinishedGoingToSleep() {mNotificationPanelViewController.onAffordanceLaunchEnded();releaseGestureWakeLock();mLaunchCameraWhenFinishedWaking = false;mDeviceInteractive = false;mWakeUpComingFromTouch = false;mWakeUpTouchLocation = null;mVisualStabilityManager.setScreenOn(false);updateVisibleToUser();updateNotificationPanelTouchState();mNotificationShadeWindowViewController.cancelCurrentTouch();if (mLaunchCameraOnFinishedGoingToSleep) {mLaunchCameraOnFinishedGoingToSleep = false;// This gets executed before we will show Keyguard, so post it in order that the state// is correct.//这里再次调用onCameraLaunchGestureDetected函数mHandler.post(() -> onCameraLaunchGestureDetected(mLastCameraLaunchSource));}// When finished going to sleep, force the status bar state to avoid stale state.updateIsKeyguard(true /* force */);}

我们再次进入到onCameraLaunchGestureDetected函数中:

//vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.javapublic void onCameraLaunchGestureDetected(int source) {mLastCameraLaunchSource = source;if (isGoingToSleep()) {if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Finish going to sleep before launching camera");mLaunchCameraOnFinishedGoingToSleep = true;return;}if (!mNotificationPanelViewController.canCameraGestureBeLaunched()) {if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Can't launch camera right now");return;}if (!mDeviceInteractive) {mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_CAMERA_LAUNCH,"com.android.systemui:CAMERA_GESTURE");}vibrateForCameraGesture();if (source == StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) {Log.i(TAG, "Camera launch");mKeyguardUpdateMonitor.onCameraLaunched();}if (!mStatusBarKeyguardViewManager.isShowing()) {Log.i(TAG, "dxf_launch1");//(1)这里直接调用startActivityDismissingKeyguard来startActivityAsUser(非锁屏情况下)startActivityDismissingKeyguard(KeyguardBottomAreaView.INSECURE_CAMERA_INTENT,false /* onlyProvisioned */, true /* dismissShade */,true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0);} else {Log.i(TAG, "dxf_launch2");if (!mDeviceInteractive) {// Avoid flickering of the scrim when we instant launch the camera and the bouncer// comes on.mGestureWakeLock.acquire(LAUNCH_TRANSITION_TIMEOUT_MS + 1000L);}if (isWakingUpOrAwake()) {if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Launching camera");if (mStatusBarKeyguardViewManager.isBouncerShowing()) {mStatusBarKeyguardViewManager.reset(true /* hide */);}// M: Mtk add for fix unresponse when swipe lock and occluded.if (!mStatusBarKeyguardViewManager.isSecure()&& mStatusBarKeyguardViewManager.isOccluded()) {Slog.d(TAG, "Non-Secure unlock, no need to launch camera");return;}Log.i(TAG, "dxf_launch3");//(2)这里通过launchCamera最终来startActivityAsUser(锁屏情况下)mNotificationPanelViewController.launchCamera(mDeviceInteractive /* animate */, source);updateScrimController();} else {// We need to defer the camera launch until the screen comes on, since otherwise// we will dismiss us too early since we are waiting on an activity to be drawn and// incorrectly get notified because of the screen on event (which resumes and pauses// some activities)if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Deferring until screen turns on");mLaunchCameraWhenFinishedWaking = true;}}}

从这里开始SystemUI分为不同的处理流程,那是为什么呢?因为这两种处理流程主要表现在锁屏和不锁屏的情况下双击Power键的流程。

(A)非锁屏情况下

07-02 16:16:27.431  3058  3058 I StatusBar: dxf_launch1
07-02 16:16:27.431  3058  3058 E dxf_startActivityDismissingKeyguard: Intent { act=android.media.action.STILL_IMAGE_CAMERA flg=0x14000000 }
07-02 16:16:27.431  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar.startActivityDismissingKeyguard(StatusBar.java:2871)
07-02 16:16:27.431  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar.onCameraLaunchGestureDetected(StatusBar.java:4186)
07-02 16:16:27.431  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar$12.lambda$onFinishedGoingToSleep$0(StatusBar.java:4027)
07-02 16:16:27.431  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar$12.lambda$onFinishedGoingToSleep$0$StatusBar$12(Unknown Source:0)

(B)锁屏情况下

07-02 16:17:25.674  3058  3058 I StatusBar: dxf_launch2
07-02 16:17:25.674  3058  3058 D StatusBar: Launching camera
07-02 16:17:25.676  3058  3058 I StatusBar: dxf_launch3
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard: Intent { act=android.media.action.STILL_IMAGE_CAMERA flg=0x14000000 (has extras) }
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar.startActivityDismissingKeyguard(StatusBar.java:2871)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar.startActivity(StatusBar.java:1896)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.ActivityStarterDelegate.startActivity(ActivityStarterDelegate.java:89)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.KeyguardBottomAreaView.launchCamera(KeyguardBottomAreaView.java:603)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.NotificationPanelViewController$KeyguardAffordanceHelperCallback.onAnimationToSideStarted(NotificationPanelViewController.java:3370)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.KeyguardAffordanceHelper.fling(KeyguardAffordanceHelper.java:356)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.KeyguardAffordanceHelper.launchAffordance(KeyguardAffordanceHelper.java:534)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.NotificationPanelViewController.launchCamera(NotificationPanelViewController.java:2761)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar.onCameraLaunchGestureDetected(StatusBar.java:4208)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar$12.lambda$onFinishedGoingToSleep$0(StatusBar.java:4027)
07-02 16:17:25.685  3058  3058 E dxf_startActivityDismissingKeyguard:   at com.android.systemui.statusbar.phone.StatusBar$12.lambda$onFinishedGoingToSleep$0$StatusBar$12(Unknown Source:0)

进而最终都会调用到StatusBar当中的startActivityDismissingKeyguard函数。

public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,final Callback callback, int flags) {android.util.Log.e("dxf_startActivityDismissingKeyguard", intent.toString(),new NullPointerException());//...intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);intent.addFlags(flags);int result = ActivityManager.START_CANCELED;result = ActivityTaskManager.getService().startActivityAsUser(null, mContext.getBasePackageName(), mContext.getAttributionTag(),intent,intent.resolveTypeIfNeeded(mContext.getContentResolver()),null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null,options.toBundle(), UserHandle.CURRENT.getIdentifier());
}

MTK平台双击Power打开Camera的简单流程相关推荐

  1. Android Camera 打开预览流程分析(一)--打开camera的SDK流程

    Android系统应用场景中,Camera的使用场景变得越来越重要,在手机端不管是牌照美颜,还是拍小视频上传小视频平台.在其他领域,如车载,倒车视频,360全景影像也同样会用到Camera接口.那我们 ...

  2. mtk平台androidl usb uvc camera 调试记录

    USB video class(又称为USB video device class or UVC)就是USB device class视频产品在不需要安装任何的驱动程序下即插即用,包括摄像头.数字摄影 ...

  3. MTK平台开机初始化时 camera驱动流程|MTK camera调试常见几十种问题处理方法

    转载:https://www.jianshu.com/p/75ab1d82bbd3 mtk的驱动多是以模块加载的方式(module_init():module_exit():)加载到内核中去的:正因为 ...

  4. MTK 平台上如何给 camera 添加一种 preview size

    1,首先检查该项目所使用的是哪一颗sensor, 就以OV2659 为例 OV2659 是一颗2M 的摄像头,Sensor 吐出的数据分辨率能达到 1600*1200,肯定是支持 1280*720 的 ...

  5. V4L2学习 二 ----视频打开与保存简单流程

    open("/dev/video0") ->VIDIOC_S_INPUT             //set input ->VIDIOC_TRY_FMT        ...

  6. MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率

    1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...

  7. MTK平台camera小结(一)

    *一.手机Camera的物理结构     [[文件:GD05 SWV 002 003 003 001.png]]       *二.Camera的成像原理     景物通过镜头(LENS)生成的光学图 ...

  8. 《整理MTK平台的Camera底层驱动流程》

    Data: 2016-04-12 星期二 说明:以下说明均是在android 5.1 ,mt6580平台为例.由于笔记是很久之前写的,到现在已经记不起当初的很多细节.以至于不能很好的总结出来,在这里只 ...

  9. MTK平台Camera Dump Buffer处理

    (1)Dump Buffer的方法 在Camera调试过程中可能会遇到预览图或拍照图有花屏,竖线等各种情况,这种情况下很多时候我们不清楚这种异常画面是如何来的?此时我们就可以通过Dump Buffer ...

最新文章

  1. 湖北黄冈中学2021年高考成绩查询,【喜报】2020年黄冈中学高考成绩出炉,600分以上人数556人...
  2. java 内部类 加载_举例讲解Java的内部类与类的加载器
  3. Oracle查询优化-04插入、更新与删除数据
  4. DjangoFreshStore项目一
  5. 选择列表和可多选的选择列表
  6. js最全的十种跨域解决方案
  7. Error:Connection timed out: connect
  8. hdu 1241 Oil Deposits 解题报告
  9. Ngnix的TCP和UDP负载平衡配置
  10. 使用dex2jar和luyten查看apk中的class代码
  11. down perm什么意思_没想到“羽绒服”竟叫down coat!为啥有个down?
  12. Kali渗透测试工具库(二)beef--Web浏览器攻击框架
  13. mysql for centos下载_CentOS下载mysql哪个版本
  14. 机器学习-对线性回归、逻辑回归、各种回归的概念学习
  15. TI - MCU - MSP430使用指南31 - BSL
  16. java连接阿里云物联网(服务器端)
  17. 普通程序员如何走出困境?【转】
  18. 职场中干好工作的18准则
  19. java sshd实现连接ssh操作
  20. The Shawshank Redemption-3

热门文章

  1. 寂寞约会吧客服务器的微信是多少钱,约会专家倪淙岩:72招教你如何微信撩妹...
  2. C# 设置文件默认打开程序
  3. 技能分享 | 麦肯锡教给我的写作武器:连接词是文章通顺的灵魂
  4. 快递鸟 物流跟踪订阅 即时查询快递 预约取件(在线下单)
  5. 小程序校园点餐系统外卖系统设计
  6. revit 二次开发之创建图纸和放置视图
  7. Java代码混淆工具ProGuard
  8. 基于vue2 + Muse-ui 开发的移动端轻社区项目 F-Rent
  9. 自动(智能)驾驶系列|(一)简介与传感器
  10. HiveSQL中级进阶常用技巧