본문 바로가기
안드로이드 자바

[JAVA][Android] 만보계를 만들어 보자

by teamnova 2021. 4. 21.

안녕하세요~

 

오늘은 스틱코드를 사용해서 만보계를 빠르게 만들어볼 예정입니다.

 

스틱코드?

stickode.com/mainlogin.html

 

STICKODE

 

stickode.com


 

레이아웃 작성

 

 

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="250dp"
        android:layout_marginBottom="30dp"
        android:text="StickCode 만보계"
        android:textSize="30dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toTopOf="@+id/stepCountTag"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/stepCountTag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="걸음수 :"
        android:textSize="25dp"
        app:layout_constraintEnd_toStartOf="@+id/stepCountView"
        app:layout_constraintStart_toStartOf="@+id/title"
        app:layout_constraintTop_toBottomOf="@+id/title" />

    <TextView
        android:id="@+id/stepCountView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="25dp"
        app:layout_constraintBottom_toBottomOf="@+id/stepCountTag"
        app:layout_constraintEnd_toEndOf="@+id/title"
        app:layout_constraintStart_toEndOf="@+id/stepCountTag"
        app:layout_constraintTop_toTopOf="@+id/stepCountTag" />

    <Button
        android:id="@+id/resetButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/stepCountView"
        app:layout_constraintStart_toStartOf="@+id/stepCountTag"
        app:layout_constraintTop_toBottomOf="@+id/stepCountTag" />

</androidx.constraintlayout.widget.ConstraintLayout>

이렇게 만보기의 메인 화면을 만들어 보았습니다

다음으로 스틱 코드를 사용하여 만보기의 기능을 추가해 보겠습니다.

 


 

만보계 기능 추가

 

1. 안드로이드 센서 사용 권한 추가

 

안드로이드 10 (Target SDK 29 )가 빌드업 되면서 센서를 사용하려면 권한을 인가 받아야 합니다. 

 

▶ AndroidManifest.xml 에 권한을 추가 해줍니다

<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

 

▶ MainActivity.java 에 권한 체크 기능을 추가 해줍니다

// 활동 퍼미션 체크
if(ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED){

  requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 0);
}

 

 

 

 

2. 센서 세팅

 

▶ MainActivity.java

// 걸음 센서 세팅
// * 옵션
// - TYPE_STEP_DETECTOR:  리턴 값이 무조건 1, 앱이 종료되면 다시 0부터 시작
// - TYPE_STEP_COUNTER : 앱 종료와 관계없이 계속 기존의 값을 가지고 있다가 1씩 증가한 값을 리턴
//
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
stepCountSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);


 // 디바이스에 걸음 센서의 존재 여부 체크
 if (stepCountSensor == null) {
   Toast.makeText(this, "No Step Sensor", Toast.LENGTH_SHORT).show();
 }

 

 

 

3. 리셋 버튼 기능 추가 - 걸음 초기화

 

▶ MainActivity.java

리셋 버튼 기능 추가

스틱코드를 사용하여 리셋 버튼에 클릭 이벤트를 만들어주고 걸음수를 초기화 하는 기능을 넣어줍니다.

 

 

 

 

4. 센서 동작 딜레이 설정

 

▶ MainActivity.java

센서 동작 딜레이 설정

스틱코드를 사용하여 센서가 동작하는 속도를 세팅 해줍니다

 

 

 

 

5. 만보계 기능 추가

 

 - 이제 센서 세팅이 끝났으니 메인 기능을 추가해 보도록 하겠습니다.

 - 걸을때 마다 센서가 작동하여 걸음수를 세는 기능 추가

 

▶ MainActivity.java

센서 이벤트 리스너 추가
센서 이벤트 리스너 메소드

 

implements SensorEventListener 를 하게 되면

onSensorChanged 메소드와 onAccuracyChanged 메소드가 추가됩니다

여기서 저희가 사용할 메소드는 onSensorChanged 입니다.

onSensorChanged :

실제 센서의 작동과 관련된 함수입니다, 센서는 동작을 감지 하면 이벤트를 발생하여 onSensorChanged에 값을 전달합니다.
    @Override
    public void onSensorChanged(SensorEvent event) {
       
        // 걸음 센서 이벤트 발생시
        if(event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR){

            if(event.values[0]==1.0f){
               
                // 센서 이벤트가 발생할때 마다 걸음수 증가
                currentSteps++;
                stepCountView.setText(String.valueOf(currentSteps));
            }

        }

    }

이렇게 만보계의 모든 기능을 추가해 보았습니다

 

 

아래는 만보계의 전체 코드입니다.

package com.example.stepcounter;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    SensorManager sensorManager;
    Sensor stepCountSensor;
    TextView stepCountView;
    Button resetButton;

    // 현재 걸음 수
    int currentSteps = 0;

    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        stepCountView = findViewById(R.id.stepCountView);
        resetButton = findViewById(R.id.resetButton);


        // 활동 퍼미션 체크
        if(ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED){

            requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 0);
        }

        // 걸음 센서 연결
        // * 옵션
        // - TYPE_STEP_DETECTOR:  리턴 값이 무조건 1, 앱이 종료되면 다시 0부터 시작
        // - TYPE_STEP_COUNTER : 앱 종료와 관계없이 계속 기존의 값을 가지고 있다가 1씩 증가한 값을 리턴
        //
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        stepCountSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

        // 디바이스에 걸음 센서의 존재 여부 체크
        if (stepCountSensor == null) {
            Toast.makeText(this, "No Step Sensor", Toast.LENGTH_SHORT).show();
        }

        // 리셋 버튼 추가 - 리셋 기능
        resetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 현재 걸음수 초기화
                currentSteps = 0;
                stepCountView.setText(String.valueOf(currentSteps));

            }
        });

    }


    public void onStart() {
        super.onStart();
        if(stepCountSensor !=null) {
            // 센서 속도 설정
            // * 옵션
            // - SENSOR_DELAY_NORMAL: 20,000 초 딜레이
            // - SENSOR_DELAY_UI: 6,000 초 딜레이
            // - SENSOR_DELAY_GAME: 20,000 초 딜레이
            // - SENSOR_DELAY_FASTEST: 딜레이 없음
            //
            sensorManager.registerListener(this,stepCountSensor,SensorManager.SENSOR_DELAY_FASTEST);
        }
    }



    @Override
    public void onSensorChanged(SensorEvent event) {
        // 걸음 센서 이벤트 발생시
        if(event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR){

            if(event.values[0]==1.0f){
                // 센서 이벤트가 발생할때 마다 걸음수 증가
                currentSteps++;
                stepCountView.setText(String.valueOf(currentSteps));
            }

        }

    }


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

 

 

 

 

테스트 결과

핸드폰을 들고 걸어다니면 걸음 수가 정상적으로 올라가는걸 확인할 수 있었습니다.