자 그럼 TYPE_STEP_DETECTOR TYPE_STEP_COUNTER는 어떻게 차이가 나는지 동시에 테스트를 진행 하면서 확인해 보도록 하겠습니다.



1. TYPE_STEP_DETECTOR 와 TYPE_STEP_COUNTER의 차이점


TYPE_STEP_DETECTOR는 어떤 상황에서건 꿋꿋하게 항상 1만 리턴 합니다.

TYPE_STEP_COUNTER는 핸드폰을 켜고 센서를 작동했을 때부터의 총 횟수의 합을 리턴 합니다.

핸드폰을 재 시작 해야만 다시 0으로 초기화 됩니다.



1.1 TYPE_STEP_DETECTOR 리턴 값


TYPE_STEP_DETECTOR의 리턴 값을 찍어 보면 무조건 1만 리턴 합니다.


Step Detect : 0 (작동 전 return 값 없음)

Step Detect : 1 (return : 1.0)

Step Detect : 2 (return : 1.0)

어플리케이션 종료 / 시작

Step Detect : 0 (작동 전 return 값 없음)

Step Detect : 1 (return : 1.0)

핸드폰 재 시작

Step Detect : 0 (작동 전 return 값 없음)

Step Detect : 1 (return : 1.0)


1.2 TYPE_STEP_COUNTER 리턴 값


TYPE_STEP_COUNTER는 어플리케이션의 종료와 관계없이 계속 기존의 값을 가지고 있다가 1씩 증가한 값을 리턴 합니다. 

다시 0으로 초기화 하려면 핸드폰을 재 시작해야 합니다.


Step Count : 0 (작동 전 return 값 없음)

Step Count : 1 (return : 1.0)

Step Count : 2 (return : 2.0)

어플리케이션 종료 / 시작

Step Count : 3 (return : 3.0)

Step Count : 4 (return : 4.0)

핸드폰 재 시작

Step Count : 0 (작동 전 return 값 없음)

Step Count : 1 (return : 1.0)


아래 그림은 어플리케이션을 켜고 동시에 센서 측정을 시작한 결과와 어플리케이션을 종료 한 후 다시 시작 했을 때의 결과 입니다.


step detector counter

step detector counter


1.3 화면 종료 후 카운트


지금까지는 화면을 켜놓고 테스트를 하였습니다.

어플리케이션을 종료하지 않고 화면만 종료하고 테스트를 진행 하고 다시 화면을 켜면 숫자가 모두 그대로 입니다.

onPause() 이 함수에서 배터리를 아껴보겠다고 센서 작동을 중단 시켜서 입니다.


onPause() 함수를 중지 시킨 상태에서 화면을 끄고 테스트를 진행 하면 TYPE_STEP_DETECTOR TYPE_STEP_COUNTER 모두 증가 한 것을 볼 수 있습니다.


만보기를 만들려면 onPause() 함수는 삭제해야 하겠지요.


step detector counter


2. 프로그램 소스

 

2.1 신규 프로젝트 생성

프로젝트 명을 적당하게 명명해서 생성 하고 기타 설정 사항도 본인의 기호에 맞게 설정 하여 신규 프로젝트를 하나 생성 합니다.


2.2 Layout 작성

센서 작동에 대한 간단한 테스트만 진행 하기 때문에 센서에서 오는 값을 출력 할 수 있을 정도의 화면만 구성 합니다.


TextView를 하나 만들고 tvTitleid를 기입합니다. 

textandroid:text="Step Sensor" 이렇게 적어주고 이 값은 변경하지 않을 타이틀 값입니다.


    TYPE_STEP_DETECTORTYPE_STEP_COUNTER 센서로부터 받아온 값을 출력하기 위해 TextView 하나는 idtvStepDetector 라고 정의 하고 android:text="Step Detect : 0" 으로 초기 값을 적어 줍니다.


    다른 TextView 하나는 idtvStepCount 라고 정의 하고 android:text="Step Count : 0" 으로 초기 값을 적어 줍니다.

<?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 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/tvStepDetector"
        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 Detect : 0"
        />
    <TextView
        android:id="@+id/tvStepCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvStepDetector"
        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


센서로 부터의 값을 받아 올 수 있도록 classSensorEventListenerimplements 시켜 줍니다.


2) 변수 정의


프로그램 내에서 사용할 변수(센서, TextView, int)들을 정의 합니다.


3) onCreate()


변수에 값을 할당 하고 TYPE_STEP_DETECTOR, TYPE_STEP_COUNTER 센서가 핸드폰에 있는지 확인 합니다.

센서가 없으면 Toast를 이용해 화면에 잠시 메시지를 하단에 팝업으로 보여 줍니다.


4) onPause(), onResume()


Sensor는 다른 어플리케이션을 사용하기 위해 일시 중지 되거나 화면을 종료(turn off)해도 계속 작동하고 있으며 전력을 소모하고 있습니다.

이를 방지하기 위해서는 어플리케이션을 완전 종료하거나 다른 어플리케이션에 의해 일시 중지되는 경우 센서의 작동을 중지 시켜주고 이벤트를 받아 다시 센서관련 어플리케이션이 활성화 되었을 경우 작동이 되도록 하여야 합니다.

그러기 위해서 onPause()에서는 중지하고 onResume()에서는 활성화 하도록 코드를 추가 합니다.


5) onSensorChanged()


TYPE_STEP_DETECTOR는 이벤트로 받아온 값이 1.0f 이면 1씩 증가시켜 화면에 정의된 TextView에 값을 넘겨 주도록 합니다.

TYPE_STEP_COUNTER는 리턴 받은 값을 그대로 화면에 넘겨 줍니다.

package com.example.desk.stepdetectorcounter;

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 stepDetectorSensor;
    TextView tvStepDetector;
    private int mStepDetector;

    private Sensor stepCountSensor;
    TextView tvStepCount;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        // DETECTOR
        tvStepDetector = (TextView)findViewById(R.id.tvStepDetector);
        stepDetectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
        if(stepDetectorSensor == null) {
            Toast.makeText(this, "No Step Detect Sensor", Toast.LENGTH_SHORT).show();
        }
        // COUNTER
        tvStepCount = (TextView)findViewById(R.id.tvStepCount);
        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, stepDetectorSensor, SensorManager.SENSOR_DELAY_NORMAL);
        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_DETECTOR) {
            if(event.values[0] == 1.0f) {
                mStepDetector += event.values[0];
                tvStepDetector.setText("Step Detect : " + String.valueOf(mStepDetector));
            }
        } else 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 Source Code


첨부된 소스파일을 다운받아 적당한 곳에 압축을 풀고 Android Studio를 이용하여 File > Open 메뉴로 프로젝트 열고 실행을 합니다.

테스트를 위해서 Target Device는 개인 핸드폰으로 설정을 합니다.

각자 설치된 android studio 버전이 달라 update가 진행 되기도 하고 압축을 풀어놓은 디렉토리가 개발을 진행한 디렉토리 정보와 차이가 나서 오류가 발생 하기도 합니다.


만약 실행 중 팝업으로 오류가

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 정보를 삭제 하고 다시 실행 하면 될 것 입니다.

 

 

StepDetectorCounter.7z



3.2 APK File

Android Studio가 없거나 귀찮아 첨부된 APK 파일을 이용하여 핸드폰에서 실행을 하려면 출처를 알 수 없은 앱 설치를 가능하게 하고 실행을 해야 합니다. 

테스트 후에는 다시 출처를 알 수 없는 앱 설치 가능을 차단 해 줍니다.

어디서 설정을 변경 했는지 모르겠다 싶으면 핸드폰에 있는 은행 앱을 하나 실행 하면 출처를 알 수 없는 앱 설치 설정 기능을 차단하라고 메시지가 나오면서 변경할 수 있는 위치로 이동할 수 있도록 되어 있으니 바꿔주면 됩니다.

 

stepDetectCount.apk


- copy coding -


+ Recent posts