본문 바로가기

안드로이드 개발

가속센서를 이용한 단말 흔들림 체크

반응형

package com.kmshack.testapp;

import android.app.Activity; 
import android.graphics.Color;
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.TextView;
   

public class testapp extends Activity implements SensorEventListener { 
   

    private long lastTime; 
    private float speed; 
    private float lastX; 
    private float lastY; 
    private float lastZ; 
   

    private float x, y, z; 
    //민감도(수치가 낮을수록 민감)
    private static final int SHAKE_THRESHOLD = 1000; 
   

    private static final int DATA_X = SensorManager.DATA_X; 
    private static final int DATA_Y = SensorManager.DATA_Y; 
    private static final int DATA_Z = SensorManager.DATA_Z; 
   

    TextView t;
    int count=0;
    private SensorManager sensorManager; 
    private Sensor accelerormeterSensor; 
   

    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
        accelerormeterSensor = sensorManager 
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
   
        t = (TextView)findViewById(R.id.TextView01);

    } 
   

    @Override 
    public void onStart() { 
        super.onStart(); 
   

        if (accelerormeterSensor != null) 
            sensorManager.registerListener(this, accelerormeterSensor, 
                    SensorManager.SENSOR_DELAY_GAME); 
    } 
   

    @Override 
    public void onStop() { 
        super.onStop(); 
   

        if (sensorManager != null) 
            sensorManager.unregisterListener(this); 
    } 
   

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

    @Override 
    public void onSensorChanged(SensorEvent event) { 
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
        { 
            long currentTime = System.currentTimeMillis(); 
            long gabOfTime = (currentTime - lastTime); 
   
            //센서 동작이 이전/이후 시간의 차이가 0.1초 이내이면
            if (gabOfTime > 100) 
            { 
                lastTime = currentTime; 

                x = event.values[SensorManager.DATA_X]; 
                y = event.values[SensorManager.DATA_Y]; 
                z = event.values[SensorManager.DATA_Z]; 
   

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


                if (speed > SHAKE_THRESHOLD) 
                { 
                    // 이벤트 발생!! 
                	count++;
                	t.setText(count +"");
                	
                } 
                
                lastX = event.values[DATA_X]; 
                lastY = event.values[DATA_Y]; 
                lastZ = event.values[DATA_Z]; 
            }
            
        } 
    }   

}

반응형