안드로이드 개발보드에 플래쉬가 없긴하지만 Quick Settings에 Flashlight 아이콘이 나오게 하고 싶다.
결론:
Quick settings에 표시하는 아이콘의 리스트는
/data/data/com.android.providers.settings/databases/settings.db의 secure 테이블에서 sysui_qs_tiles컬럼으로 관리된다.
없을경우 R.string.quick_settings_tiles 에서 표시할 리스트를 가져온다. 여기에 필요한 리스트를 추가하면 된다.
확인 결과 quick settings tile list에 기본값으로 flashlight는 포함된다.
하지만 FlashlightController에서 비활성화 플래그로 인해 표시를 하지않는다. 이 값을 강제로 설정하면 표시는 가능하다.
과정:
Flashlight는 카메라 서비스에서 제공되는 기능으로 카메라 API를 통해서 제어를 할 수있다.
Quick settings icon의 경우 SystemUI에서 관리한다.
//SystemUI 설정 (QSTileHost.java 참조)
1) settings.db 업데이트
adb shell settings get secure sysui_qs_tiles
adb shell settings put secure sysui_qs_tiles wifi,bt,inversion,cell,airplane,rotation,flashlight,location,cast,hotspot
settings put을 하면 바로 화면에 적용된다.
위 명령에서 설정값이 없으면 R.string.quick_settings_tiles 에서 리스트를 가져온다.
2)SystemUI/res/values/config.xml
- R.string.quick_settings_tiles
- R.string.quick_settings_tiles_default
- quick settings의 행과 열 설정값.
- 각종 UI 타이밍 설정값
settings.db의 sysui_qs_tiles의 기본값은 flashlight가 포함되어 있는데, 안나온다.
flashlight 타일의 소스를 보면 HAL포팅이 되어있어야 온/오프 표시가 된다는 것을 알수 있다.
* SystemUI 소스확인
소스위치 : android/frameworks/base/packages/SystemUI
Quick settings 소스 위치: SystemUI/src/com/android/systemui/qs
Status Bar의 명칭 : http://minuhome.tistory.com/13
//타이틀 리스트 생성
../systemui/statusbar/phone/QSTileHost.java :
QSTileHost : recreateTiles()
{ final List<String> tileSpecs = loadTileSpecs();
createTile(titleSpec)); }
//타이틀 리스트에 따라 퀵세팅 인스턴스생성
QSTileHost : createTile() { else if (tileSpec.equals("flashlight")) return new FlashlightTile(this); }
//플래쉬 라이트 초기화
src/com/android/systemui/qs/tiles/FlashlightTile.java
//플래쉬상태표시
아래 FlsahController가 활성화 되어 있을경우 표시가된다.
강제로 state.visible=true로 하면 퀵세팅패털에서 플래쉬아이콘을 볼 수 있다.:
handleUpdateState()
state.visible = mWasLastOn != 0 || mFlashlightController.isAvailable();
//개발보드 HAL 로깅메시지
10-06 04:08:22.790 2468-2468/? D/ExynosCameraParameters: [CAM_ID(1)][ParametersFront]-DEBUG(setParameters):strNewFlashMode off
*플래쉬 HAL
각 보드별 특성 설정: android/device/company/products
컴파일 결과물: android/out
HAL Module : out/target/product/mv7420/obj/lib/*.so
HAL Module은 커널의 장치를 제어하는 인터페이스 라이브러리이다.
아래 링크정보를 보고 어떤파일이 컴파일되는 지 확인해 볼수 있다.
HAL Module link 정보:
out/target/product/mv7420/obj/SHARED_LIBRARIES/module_namexxx_intermediates/module_namexxx.P
백라이트 HAL:
Nexus: android/device/lge/liblight
HTC: android/device/htc/flounder/lights
mv7420: device/samsung/smdk_common/liblight/lights.c
센서 HAL
Nexus: android/device/lge/libsensor
HTC: android/device/htc/flounder/sensor_hub/libsensors
mv7420: vendor/invensense/libsensors_HAL_1_1/sensors_mpl.cpp
오디오 HAL
android/device/samsung/mv7420/audio
카메라 HAL
libexynoscamera.so : hardware/samsung_slsi/exynos7420/libcamera/ExynosCameraSensorInfo.cpp
libcamera_client.so : frameworks/av/camera/*.c
libcamera_metadata.so : system/media/camera/src/*.c
libcameraservice.so : frameworks/av/services/camera/libcameraservice/*.cpp
1. 카메라 매니져 접근:
SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java :
mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
2. 카메라 장치 오픈
SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java :
mCameraManager.openCamera(getCameraId(), mCameraListener, mHandler);:0:
3. 플래시 명령 전달
builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
*특정 태크 로깅 설정
Dalvik property 설정:setprop log.tag.<your_log_tag> <level>
$ ./adb shell stop
$ ./adb shell setprop log.tag.QSTileHost DEBUG
$ ./adb shell setprop log.tag.FlashlightController DEBUG
$ ./adb shell start
*파워버튼 두번 누르면 카메라켜기
android/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
powerMultiPressAction(..) {
...
case MULTI_PRESS_POWER_LAUNCH_CAMERA:
Slog.i(TAG, "Launching camera by power button.");
if (!mCameraLensCoverState != CAMERA_LENS_COVERED) {
if (!interactive) {
wakeUpFromPowerKey(eventTime);
}
launchCamera();
}
break;
...
}
댓글 없음:
댓글 쓰기