Notice
Recent Posts
Recent Comments
Link
투케이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) {
}
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
/* =========================== */
[파일 첨부]
/* =========================== */
반응형
'Android' 카테고리의 다른 글
Comments