투케이2K

167. (AndroidStudio/android/java) Sensor TYPE_ACCELEROMETER 가속도 센서 사용해 흔들림 (shake) 이벤트 감지 본문

Android

167. (AndroidStudio/android/java) Sensor TYPE_ACCELEROMETER 가속도 센서 사용해 흔들림 (shake) 이벤트 감지

투케이2K 2021. 6. 23. 16:25

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

 

/** ========== [구현 부분 설명 실시] ========== */
    /**
     * 1. class 클래스에서 SensorEventListener 를 implements 상속 받습니다
     * 2. onResume 에서 디바이스가 가속도 센서를 지원하는지 확인합니다
     * 3. onResume 에서 가속도 센서를 지원하는 경우 리시버를 등록합니다
     * 3. oncreate 액티비티 시작 상태에서 기능 동작을 실시합니다
     * 4. onPause 에서 액티비티 실행이 정지가 된 경우 리시버 등록을 해제합니다
     * */





/** ========== [클래스 전역 변수 선언] ========== */
    String deviceSensor = "";
    SensorManager mSensorManager = null;
    Sensor sensor = null;
    private long eventTime = 0;





/** ========== [액티비티 실행 준비 메소드] ========== **/
    @Override
    public void onResume(){
        super.onResume();
        Log.d("---","---");
        Log.w("//===========//","================================================");
        Log.d("","\n"+"[A_Shake > onResume() 메소드 : 액티비티 실행 준비 실시]");
        Log.w("//===========//","================================================");
        Log.d("---","---");
        //TODO [외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함]
        try {
            overridePendingTransition(0,0);
        }
        catch (Exception e){
            e.printStackTrace();
        }

        //TODO [디바이스 가속도 지원 여부 확인 및 센서 리시버 등록 실시]
        if(checkDeviceAccelerometer() == true){
            registerSensor();
        }
    }





/** ========== [액티비티 실행 정지 메소드] ========== **/
    @Override
    public void onPause(){
        super.onPause();
        Log.d("---","---");
        Log.e("//===========//","================================================");
        Log.d("","\n"+"[A_Shake > onPause() 메소드 : 액티비티 실행 정지 실시]");
        Log.e("//===========//","================================================");
        Log.d("---","---");
        //TODO [외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함]
        try {
            overridePendingTransition(0,0);
        }
        catch (Exception e){
            e.printStackTrace();
        }

        //TODO [센서 리시버 등록 해제 수행 실시]
        unregisterSensor();
    }





/** ========== [디바이스 가속도 지원 확인] ========== **/
    public boolean checkDeviceAccelerometer(){
        boolean result = false;
        try {
            mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            if (sensor != null) {
                Log.d("---","---");
                Log.w("//===========//","================================================");
                Log.d("","\n"+"[A_Shake > checkDeviceAccelerometer() 메소드 : 디바이스 가속도 지원 확인 실시]");
                Log.d("","\n"+"[지원 여부 : true]");
                Log.w("//===========//","================================================");
                Log.d("---","---");
                result = true;
            }
            else {
                Log.d("---","---");
                Log.e("//===========//","================================================");
                Log.d("","\n"+"[A_Shake > checkDeviceAccelerometer() 메소드 : 디바이스 가속도 지원 확인 실시]");
                Log.d("","\n"+"[지원 여부 : false]");
                Log.e("//===========//","================================================");
                Log.d("---","---");
                result = false;
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        deviceSensor = String.valueOf(result);
        return result;
    }





/** ========== [Sensor 리시버 등록 메소드] ========== **/
    public void registerSensor(){
        try {
            if(mSensorManager != null && sensor != null){
                Log.d("---","---");
                Log.w("//===========//","================================================");
                Log.d("","\n"+"[A_Shake > registerSensor() 메소드 : 센서 리시버 등록 수행 실시]");
                Log.w("//===========//","================================================");
                Log.d("---","---");
                mSensorManager.registerListener(A_Shake.this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            }
            else {
                Log.d("---","---");
                Log.e("//===========//","================================================");
                Log.d("","\n"+"[A_Shake > registerSensor() 메소드 : 센서 리시버 등록 수행 실패]");
                Log.e("//===========//","================================================");
                Log.d("---","---");
                //TODO [Alert 팝업창 알림 실시]
                getAlertDialog("[알 림]",
                        "센서 리시버 등록 실패 ...",
                        "확인", "", "");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }





/** ========== [Sensor 리시버 해제 메소드] ========== **/
    public void unregisterSensor(){
        try {
            if(mSensorManager != null && sensor != null){
                Log.d("---","---");
                Log.w("//===========//","================================================");
                Log.d("","\n"+"[A_Shake > registerSensor() 메소드 : 센서 리시버 해제 수행 실시]");
                Log.w("//===========//","================================================");
                Log.d("---","---");
                mSensorManager.unregisterListener(A_Shake.this);
            }
            else {
                Log.d("---","---");
                Log.e("//===========//","================================================");
                Log.d("","\n"+"[A_Shake > registerSensor() 메소드 : 센서 리시버 해제 수행 실패]");
                Log.e("//===========//","================================================");
                Log.d("---","---");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }





/** ========== [SensorEventListener 이벤트 상속] ========== **/
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            Log.d("---","---");
            Log.d("//===========//","================================================");
            Log.d("","\n"+"[A_Shake > onSensorChanged() 메소드 : 가속도 센서 값 변경 상태 확인]");
            Log.d("//===========//","================================================");
            Log.d("---","---");

            //TODO [흔들기 감지를 위한 변수값 선언]
            //final float SHAKE_GRAVITY = 2.7F;
            final float SHAKE_GRAVITY = 2.5F;

            //TODO [이벤트로 들어온 X, Y, Z 값 확인]
            float axisX = event.values[0];
            float axisY = event.values[1];
            float axisZ = event.values[2];

            //TODO [중력 가속도 X, Y, Z 값 구하기]
            float gravityX = (axisX / SensorManager.GRAVITY_EARTH);
            float gravityY = (axisY / SensorManager.GRAVITY_EARTH);
            float gravityZ = (axisZ / SensorManager.GRAVITY_EARTH);

            float data = gravityX * gravityX * gravityY * gravityY * gravityZ * gravityZ;
            double squared = Math.sqrt(Double.valueOf(data));

            float result = (float) squared;
            Log.d("---","---");
            Log.w("//===========//","================================================");
            Log.d("","\n"+"[A_Shake > onSensorChanged() 메소드 : 가속도 센서 값 변경 상태 확인]");
            Log.d("","\n"+"[result : "+String.valueOf(result)+"]");
            Log.w("//===========//","================================================");
            Log.d("---","---");
            result_edit.setText(String.valueOf(result));

            //TODO [흔들기 발생 결과 확인]
            if(result > SHAKE_GRAVITY){
                // TODO [2초 이내 다시 발생한 이벤트라면 무시]
                if (SystemClock.elapsedRealtime() - eventTime < 2000){
                    return;
                }
                eventTime = SystemClock.elapsedRealtime();

                //TODO [흔들기 발생 로직 처리 실시 : Alert 팝업창 알림 실시]
                getAlertDialog("[알 림]",
                        "흔들기 이벤트가 발생했습니다 !!!",
                        "확인", "", "");
            }
        }
    }

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

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

/* =========================== */

[파일 첨부]

전체 소스코드.txt
0.02MB

/* =========================== */

반응형
Comments