Android QuickSetting---手電筒控制

今天遇到問題 打開手電筒,再進入相機下拉通知欄中有手電筒已開啓的提示。現總結與手電筒相關的知識點。 
在下拉通知欄打開手電筒的代碼位於「frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java」java

1、FlashlightTile的繼承、實現類
FlashlightTile繼承自QSTile,並實現了FlashlightController.FlashlightListener android


1.1 QSTile.java,位於「frameworks/base/packages/SystemUI/src/com/android/systemui/qs」 
QSTile,指的是Quick settings tile,屏幕頂端下拉通知欄的快速設置。手電筒對應的就是標紅的位置,在代碼中對應FlashlightTile。 ide


Android7.0中,普通的開發者應用也能夠在下拉通知欄中執行本身的設置了,具體的能夠參考http://blog.csdn.net/jy03773322/article/details/52799481 ,這篇文章介紹了Android7.0下,開發者應用在屏幕下拉的設置。 
回到QSTile.java中,這是一個抽象類 工具


先看這兩個類的三個抽象方法,三個抽象方法的具體實現都在相應的實現類中。 ui


同時,這個類中有一個Handler,handleClick()對應CLICK事件,handleRefreshState(msg.obj)對應REFRESH_STATE事件。 .net


點擊事件以handleClick()爲例,公共方法click()會向mHandler發送CLICK。 blog


這個公共方法會在QSPanel.java(frameworks/base/packages/SystemUI/src/com/android/systemui/qs)中,監聽到Click事件後,調用此公共方法QSTile的click()。 繼承


1.2 FlashlightListener,」frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java」 
FlashlightListener是FlashlightController.java的一個內部接口,這個內部接口有三個方法須要實現,具體的實現內容在實現類中,這裏不進行過多的解釋。 接口


2、FlashlightTile的處理邏輯
2.1 下拉通知欄手電筒按鈕的具體實現 
FlashlightTile的大部分方法都是@Override,實現的抽象方法或接口。以handlerClick()爲例,這個方法就是QSTile的抽象方法handlerClick(),在通知欄上面點擊閃光燈按鈕,最終的實現就是如下的代碼。最後閃光燈打開關閉執行的代碼是mFlashlightController.setFlashlight(newState)。 事件


2.2 手電筒打開的流程 
進入FlashlightController.java,查看setFlashlight()方法。能夠看到,最終打開手電筒的語句是mCameraManager.setTorchMode(mCameraId, enabled),經過語句表面的意思咱們能夠看出,這是經過Camera去打開手電筒的。 


Android設備的手電筒是從屬於Camera的一個輔助工具,在Android系統中,若是想使用手電筒服務,都要經過CameraService服務得到,看到這裏,在通知欄打開手電筒的一個流程基本上梳理清晰了。 

3、打開手電筒,再進入相機下拉通知欄中有手電筒已開啓的提示 我在項目中遇到的問題是打開手電筒,再進入相機下拉通知欄中有手電筒已開啓的提示,經過現象能夠分析到,在進入Camera後,CAMERA_SERVICE被相機搶佔,那麼通知欄沒有更新。

相關文章
相關標籤/搜索