본문 바로가기

Project/APP

근접 센서를 이용한 밝기조절 / 배터리 아끼기

 

 

 

 

 

- 문제

 

 1. 기기를 켜진 상태로 유지 ? CPU만 켜진 상태로 유지 ? 밝기만 바꾸기?

 

https://developer.android.com/training/scheduling/wakelock?hl=ko#wakeful

 

기기를 켜진 상태로 유지  |  Android 개발자  |  Android Developers

기기를 켜진 상태로 유지 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 배터리가 많이 소모되지 않도록 유휴 상태의 Android 기기는 빠르게 절전 모드로 전

developer.android.com

 

 2. 잠긴화면에 대한 접근

 

 

 

- 문제해결

 

 1 - 1.

 우리의 솔루션은 태양열 발전기를 이용한 배터리 운영에 있기에 최대한 전력을 아끼기 위해 항상 스크린을 밝게 하면 안될 것 같았다.

첫번째로는 설정에 들어가 태블릿 자체의 배터리를 저전력모드를 항상 유지하려고 했는데

아이폰과 다르게 수치가 90퍼 이하로 떨어지지 않으면 사용할 수 없었다.

이후 두번째로 머릿 속으로는 센서를 통해 주변에 아무도 없으면 밝기가 0 이였다가 센서가 작동하면 10으로 바뀌는 그런 상상을 하고

검색에 나섰다.

 

 다행히 태블릿에는 다양한 내장센서가 존재했고, 그것을 사용하기로 하고

밝기 조절은 wake lock을 사용해보기로 했다.

 

 

 

내장센서 메소드

int TYPE_ACCELEROMETER 1 가속도 감지, 외부의 충격량과 방향 감지 센서
int TYPE_ALL -1 모든 센서
int TYPE_AMBIENT_TEMPERATURE 13 주위 온도 감지 센서
int TYPE_GAME_ROTATION_VECTOR 15 보정되지 않은 회전 벡터 센서
int TYPE_GEOMAGNETIC_ROTATION_VECTOR 20 지자기 회전 벡터
int TYPE_GRAVITY 9 축의 방향과 중력 감지
int TYPE_GYROSCOPE 4 회전 정보 감지, 다양한 축의 회전각 감지
int TYPE_LIGHT 5 빛의 세기 감지 센서
int TYPE_MAGNETIC_FIELD 2 자기장 센서
int TYPE_MOTION_DETECT 30 움직임 감지 센서
int TYPE_ORIENTATION 3 방향각 감지 센서
int TYPE_PRESSURE 6 압력 센서
int TYPE_PROXIMITY 8 근접한 물체와의 거리 감지 센서
int TYPE_RELATIVE_HUMIDITY 12 상대 습도 센서
int TYPE_ROTATION_VECTOR 11 회전 벡터 센서
int TYPE_SIGNIFICANT_MOTION 17 중요한 모션 트리거 센서
int TYPE_STEP_COUNTER 19 발걸음 횟수 센서
int TYPE_STEP_DETECTOR 18 발걸음 감지 센서
int TYPE_TEMPERATURE 7 온도 감지. API level 14에서 사용

       

 

센서 관련 코드

 class MainActivity : AppCompatActivity(), SensorEventListener { //제일 중요한 센서이벤트리스너등록
 
 //센서 관련 정의
    private lateinit var sensorManager: SensorManager
    private var proximitySensor: Sensor? = null
    
    override fun onCreate(savedInstanceState: Bundle?) {
   // 센서 매니저 초기화
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)  
  
   // 근접 센서 리스너 등록
        if (proximitySensor != null) {
            sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL)
        }
        
        //센서를 이용한 조건문 사용
        override fun onSensorChanged(event: SensorEvent) {
        if (event.sensor.type == Sensor.TYPE_PROXIMITY) {
            val distance = event.values[0]
            
            override fun onResume() {
        super.onResume()
        // 근접 센서 리스너 등록
        if (proximitySensor != null) {
            sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL)
        }
    }

    override fun onPause() {
        super.onPause()
        // 근접 센서 리스너 해제
        sensorManager.unregisterListener(this)
        // 핸들러 메시지와 콜백 제거
        handler.removeCallbacksAndMessages(null)
    }

 

 

2 - 1

 

 문제는 여기서 발생했는데 잠금화면이 되어버리면 굉장히 까다로운 접근이 필요했다. 아직은 내가 해결할 수 없다고 판단이 들어

다른 방법을 찾았다. 처음에 생각했 던 가장 기본으로 돌아가 밝기조절만 하는 것이다. 그래도 많이 줄일 수 있으니까...

(그리고 배터리에 안좋다고 하니까..ㅎㅎ)

 

wake lock에서 찾았던 공식문서에 있는 

window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

 

를 사용하여 항상 켜져있지만 밝기 조절을 할 수 있게 했다.

 

센서 조건문 함수에 조건에 맞게 밝기 조절 함수를 추가로 넣으면 끝! ( 3일 넘게 걸림 ) 미래의 사수님 보고싶습니다.

 

 

 

 그 외

 근접센서의 거리는 대략 50cm로 생각보다 길었고 사실 이게 통화할 때 사용된다고 한다.

 다양한 내장센서를 활용한 것들도 해보고 싶지만 프로젝트가 우선이니까 ^^