TYPE_STEP_COUNTER 센서는 TYPE_STEP_DETECTOR 센서와 작동 방법이 동일 하고 리턴 값만 차이가 나기 때문에
TYPE_STEP_DETECTOR 센서 내용을 복사 해서 대충 적어 봅니다..
1. Sensor event data
1.1 걸음 감지 센서 이벤트 값
센서가 작동되면 움직임을 감지 하고 있다가 걷기 동작이 진행 되면 감지될 때마다 1씩 증가된 최종 값을 리턴 받아 올 수 있습니다.
TYPE_STEP_DETECTOR 센서와 달리 걷기 동작을 감지하여
계속 덧셈을 하고 있기 때문에 이 센서를 사용하여
만보기를 만든다면 최종 값만 보여주면 됩니다.
1.2 걸음 수 측정 센서 이벤트 값
Sensor |
Sensor event data |
표현 값 |
측정 단위 |
TYPE_STEP_COUNTER |
SensorEvent.values[0] |
핸드폰이 다시시작(reboot) 된 이후 부터의 걸음 수 |
걸음 수 |
1.3 센서의 이벤트 비율(rate)
- SENSOR_DELAY_NORMAL : 200,000 microsecond delay
- SENSOR_DELAY_UI : 60,000 microsecond delay
- SENSOR_DELAY_GAME : 20,000 microsecond delay
- SENSOR_DELAY_FASTEST : 0 microsecond delay
2. 걸음 감지 센서 프로그램
2.1 신규 프로젝트 생성
프로젝트 명을 적당하게 명명해서 생성 하고 기타 설정 사항도 본인의 기호에 맞게 설정 하여 신규 프로젝트를 하나 생성 합니다.
2.2 Layout 작성
센서 작동에 대한 간단한 테스트만 진행 하기 때문에 센서에서 오는 값을 출력 할 수 있을 정도의 화면만 구성 합니다.
어플리케이션을 작동 시켰을 때 초기 화면에 보여주는 값들 입니다.
- TextView를 하나 만들고 id는
tvTitle로 정의합니다.
text는 android:text="Step Counter Sensor" 이렇게 적어주고 이 값은 변경하지 않을 값입니다.
- TextView를 하나 더 생성 하고 id를
tvStepCounter 라고 정의해 둡니다.
TYPE_STEP_COUNTER
Sensor 센서로부터 받아온 값을 출력할 때 사용 할 용도 이며
text는 android:text="Step Count : 0" 으로 초기 값을 일단 적어 줍니다.
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Step Counter Sensor" android:layout_marginTop="50dp" android:textSize="30dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tvStepCount" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/tvTitle" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:textSize="25dp" android:text="Step Count : 0" /> </android.support.constraint.ConstraintLayout>
2.3 MainActivity.java
1) class implement
센서로 부터의 값을 받아 올 수 있도록 class에 SensorEventListener를 implements 시켜 줍니다.
onSensorChanged()와 onAccuracyChanged() 함수를 override 할 수 있습니다.
2) 변수 정의
프로그램 내에서 사용할 변수(SensorManager, Sensor, TextView, int)들을 정의 합니다.
3) onCreate()
설정한 변수들에 값을 할당 하고 TYPE_STEP_COUNTER 센서가 핸드폰에 있는지 확인 합니다.
센서가 없으면 Toast를 이용해 화면에 잠시 메시지를 하단에 팝업으로 보여 줍니다.
4) onPause(), onResume()
Sensor는 다른 어플리케이션을 사용하기 위해 일시 중지 되거나 화면을 종료(turn off)해도 계속 작동하고 있으며 전력을 소모하고 있습니다.
이를 방지하기 위해서는 어플리케이션을 완전 종료하거나 다른 어플리케이션에 의해 일시 중지되는 경우 센서의 작동을
중지 시켜주고
이벤트를 받아 다시 센서관련 어플리케이션이 활성화 되었을 경우 작동이 되도록 하여야 합니다.
그러기 위해서 onPause()에서는 중지하고 onResume()에서는 활성화 하도록 코드를 추가 합니다.
5) onSensorChanged()
실제 센서의 작동과 관련된 함수입니다. 센서는 동작을 감지 하면 이벤트를 발생하여onSensorChanged 함수에 값을 전달 합니다.
이벤트가 발생하여 함수에 전달되는 값은 걸음을 걸을 때마다 1씩 증가된 최종 값으로 화면에
정의된 TextView에 값을 넘겨 주도록 합니다.
어플리케이션을 실행해 보면 카운트가 1씩 증가하는걸 볼 수 있습니다.
- MainActivity.java
package com.example.desk.stepcounter; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; private Sensor stepCountSensor; TextView tvStepCount; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvStepCount = (TextView)findViewById(R.id.tvStepCount); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); stepCountSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); if(stepCountSensor == null) { Toast.makeText(this, "No Step Detect Sensor", Toast.LENGTH_SHORT).show(); } } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, stepCountSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) { tvStepCount.setText("Step Count : " + String.valueOf(event.values[0])); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }
3. 결과
3.1 결과 화면
프로젝트를 가상 디바이스가 아닌 실제 핸드폰에서 실행하고 잠시 걸어 다니면서 테스트한 결과 아래와 같은 화면이 나옵니다.
어플리케이션을 종료한 후 다시 시작하면 값이 초기화 되어 Step Count : 0 으로 되며 다시 1씩 증가하게 됩니다.
3.2 Source Code
첨부된 소스파일을 다운받아 적당한 곳에 압축을 풀고 Android Studio를 이용하여 File > Open 메뉴로 프로젝트 열고 실행을 합니다.
테스트를 위해서 Target Device는 개인 핸드폰으로 설정을 합니다.
각자 설치된 android studio 버전의 차이와 lib들에 차이가 있어 어플리케이션을 Run 하면 update가 필요 하기도 하고 압축을 풀어놓은
디렉토리가 제가 개발을 진행한 디렉토리 정보와 차이가 나서 오류가 발생 하기도 합니다.
업데이트는 잠시 기다리며 finish를 기다려 줍니다.
만약 실행 중 팝업으로 오류가
Installation failed with message Invalid File: E:\android\app\build\intermediates\split-apk\debug\slices\slice_3.apk
이것 비스무리 하게 발생한다면 Android Studio 상단 Build 메뉴 에서
Build > Clean Project
Build > Rebuild Project
메뉴를 이용하여 기존 Build 정보를 삭제 하고 다시 실행 하면 될 것 입니다.
3.3 APK File
Android Studio가 없거나 설치가 귀찮으면 첨부된 APK 파일을 이용하여 핸드폰에서 실행해도 됩니다.
처음 설치를 하려고 하면 출처를 알 수 없은 앱을 굳이 설치 하려고 하느냐고 물어보는데 그럴꺼라고 설정을 해야 설치됩니다.
테스트 후에는 다시 출처를 알 수 없는 앱 설치 가능을 차단 해 줍니다.
어디서 설정을 변경 했는지 모르겠다 싶으면 핸드폰에 있는 은행 앱을 하나 실행해 봅니다.
그러면 출처를 알 수 없는 앱 설치 설정 기능을 차단하라고 메시지가 나오면서 변경할 수 있는 위치로 이동할 수 있도록 되어 있으니 바꿔주면 됩니다.
- copy coding -
'Android' 카테고리의 다른 글
안드로이드 광 센서 테스트 (TYPE_LIGHT) (0) | 2018.09.27 |
---|---|
안드로이드 핸드폰 센서 비교 (TYPE_STEP_DETECTOR 와 TYPE_STEP_COUNTER) (2) | 2018.09.15 |
안드로이드 핸드폰 걸음 감지 센서 작동 테스트 (TYPE_STEP_DETECTOR) (3) | 2018.09.12 |
안드로이드 핸드폰 근접 센서 작동 테스트 (TYPE_PROXIMITY) (0) | 2018.09.10 |
안드로이드 핸드폰 센서 종류 직접 확인 해보기 (0) | 2018.08.31 |