하루에 0.01%라도 성장하자

Develop/Android

Android - TYPE_STEP_COUNTER, TYPE_STEP_DETECTOR

뚠님 2020. 12. 27. 01:13
728x90
반응형

SensorManager를 이용한 걸음 수 체크를 하는 앱을 개발하기 위해서 두가지 센서에 대한 특징 파악이 필요하다.

 

TYPE_STEP_COUNTER

 

출처 - Android Developer

 

특징으로는 핸드폰이 켜진순간 부터 현재까지 누적된 카운트를 보여준다.

따라서 서비스(Service)를 이용한 백그라운드 앱실행을 하면서 센서 수치를 측정될 때마다 측정할 필요는 없다. 센서가 자동으로 누적되기 때문.

 

다른 특징으로는 핸드폰을 껐다가 다시 키면 수치가 0으로 초기화 된다.

 

다만 하루치의 걸음 수를 측정하려면 계산이 필요하다.

 

계산하는 법은 

 

1. 앱이 실행되면 현재 센서 수치를 저장한다. ( previousStep )

2. 00시나 23시 59분에 센서 수치를 한번 더 측정한다. ( currentStep )

3. 현재수치에서 저장한 수치를 뺀다 ( currentStep - previousStep ) 여기서 오늘 걸음 수가 나온다. ( todayStep )

4. 현재 수치를 다시 저장한다. ( previousStep = currentStep )

5. 2~4번을 반복한다.

 

 

 

TYPE_STEP_DETECTOR

 

출처 - Android Developer

 

리턴값이 늘 1인 센서다.

즉 TYPE_STEP_COUNTER 처럼 자동으로 누적되는 수치가 아닌, 개발자가 직접 더해서 사용해야 하는값.

항간에서는 TYPE_STEP_DETECTOR 보다 조금 더 정확한(?) 수치측정이 가능하다고 하나 이는 개발자마다 말이 달라서 잘 모르겠다.

 

우선 TYPE_STEP_DETECTOR의 경우 센서가 움직여서 이벤트가 감지되면 1을 리턴하며 그 값을 개발자가 계산하여 관리해야 하기 때문에 서비스(Service) 등록이 반 강제로 될 수 밖에 없다.

 

또한 Android OS 보안 정책 강화로 백그라운드 서비스 사용시 화면 상단에 Notification을 띄워야 하기 때문에 이 부분에 대한 거부감이 있는 사용자를 대상으로 하는 앱을 개발 할 경우 신중하게 결정 해야 하는 부분이다.

 

이 센서를 이용해서 걸음 수를 계산하려면

 

1. 센서의 수치를 계속 누적으로 저장할 변수를 만든다 ( todayStep )

2. 센서 수치 업데이트 이벤트가 발생하면 전달 받은 수치 값을 받아 계속 더해준다 ( todayStep++ or todatStep += count )

3. 00시나 23시 59분이 되면 todayStep의 누적된 값을 별도로 저장하고, 0으로 초기화 해준다.

4. 2~3번 반복

 

 

선택의 기준?

 

어떤 센서를 사용하여 측정할 것인지에 대한 선택의 기준을 굳이 따지자면

위에 TYPE_STEP_DETECTOR에 작성해 놓은 것 처럼 서비스를 사용하여 상단에 Notification을 계속 띄워도 되는 앱인가?에 대한 답이 먼저 나와야 한다.

 

Android OS 8.0 ( API Level 26 ) 부터 service를 이용한 백그라운드 앱 실행시 startForeground를 호출하여 사용자에게 Notification을 상시로 노출해야 하는 보안 정책이 생겼다.

 

물론 우회하는 방법이 있다고는 하나.. 추천하진 않는다.

( 어떠한 이유든 보안정책을 위배하거나 우회하는 것은 별로 좋지 않다고 생각한다... )

 

여튼...foreground Service를 계속 띄워도 되는 앱이라면 TYPE_STEP_DETECTOR 를 사용할 수 있는 선택할 수도 있다.

 

추가 권한

 

Android OS 10 ( API Level 28 ) 부터 SensorManager를 이용하려면 ACTIVITY_RECOGNITION 권한Runtime으로 허용받아야 센서에 대한 접근이 가능하다.

( 이거 때문에 한 30분 헛고생 함 ㅠㅠ 하필 내 테스트 폰은 Android 9.0이어서..ㅠ )

 

 

728x90
반응형