안드로이드 자바

[Java][Android] 가속계(accelerometer)센서 감지하기

teamnova 2025. 5. 12. 15:28
728x90

기기의 흔들림 감지하기

기기가 흔들리는 걸 감지해서 토스트 메시지를 띄우는 예제입니다.

 

왜 사용할까요? (활용 목적)

가속도계를 사용하면 다음과 같은 동작 기반 (두 대상간의 상호작용)을 구현할 수 있습니다:

  • 기기를 흔들어 기능 실행 (예: 랜덤 뽑기, 새로고침)
  • 사용자의 움직임 감지 (만보기, 피트니스 앱)
  • 게임 컨트롤러로 사용 (기울이기, 흔들기)
  • 보안 기능 (예: 강제 흔들 때 긴급 메시지 전송)

어디에 사용하면 좋을까요? (활용 예시)

예시설명
랜덤 추첨 앱 흔들면 결과를 무작위로 선택
QR 스캐너 흔들면 플래시 ON/OFF
메모 앱 흔들면 ‘실수로 지운 항목 복구’
게임 기기를 기울이거나 흔들어서 캐릭터 조작
긴급 SOS 앱 기기를 격하게 흔들면 지정된 번호로 메시지 전송

어떻게 동작할까요? (코드 요약)

구성요소:

  • SensorManager : 센서 시스템에 접근
  • Sensor.TYPE_ACCELEROMETER : 가속도계 센서
  • SensorEventListener : 센서 이벤트 수신
  • 가속도의 급격한 변화 → 흔들림 판단

 

코드


import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor accelerometer;

    private float lastX, lastY, lastZ;
    private long lastTime;
    private static final int SHAKE_THRESHOLD = 500; // 민감도 조절

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

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        if (sensorManager != null) {
            accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (accelerometer != null)
            sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        long curTime = System.currentTimeMillis();

        if ((curTime - lastTime) > 100) {
            long diffTime = curTime - lastTime;
            lastTime = curTime;

            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];

            float speed = Math.abs(x + y + z - lastX - lastY - lastZ) / diffTime * 10000;

            if (speed > SHAKE_THRESHOLD) {
                Toast.makeText(getApplicationContext(), "흔들림 감지됨!", Toast.LENGTH_SHORT).show();
            }

            lastX = x;
            lastY = y;
            lastZ = z;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // 사용하지 않음
    }
}

 

시연영상