중력 센서(TYPE_GRAVITY)는 중력 가속도에 대한 값을 반환하는 센서 입니다.
중력 센서를 가속도 센서 비교 (TYPE_ACCELEROMETER / TYPE_LINEAR_ACCELERATION)를 할 때
다루지 않은 이유는 가속센서는 조금만 움직여도 가속도 값이 더해져서 표시가 됩니다.
중력 센서는 그냥 중력만 표시할 뿐 그 이외의 어떠한 값이 포함 되지 않습니다.
즉, 아무리 핸드폰을 흔들고 달려보아도 총 중력 값이 변하지 않고 항상 9.8의 값을 유지 합니다.
이 말은 z축의 값이 9.8이 되도록 한다면 핸드폰은 완전한 평형을 이루고 있다는 뜻이고
중력 센서를 이용하면 간단하게라도 수평계를 만들 수 있습니다.
1 중력 센서
1.1 중력 센서 이벤트 값
TYPE_GRAVITY 센서가 작동 되면 리턴되는 값으로 다음과 같은 value를 넘겨 주며 단위는 가속도(m/s2) 입니다.
Sensor |
Sensor event data |
표현 값 |
측정 단위 |
TYPE_GRAVITY |
SensorEvent.values[0] |
x축 중력 강도 |
m/s² |
TYPE_GRAVITY |
SensorEvent.values[1] |
y축 중력 강도 |
m/s² |
TYPE_GRAVITY |
SensorEvent.values[2] |
z축 중력 강도 |
m/s² |
2 중력 센서 프로젝트
2.1 신규 프로젝트 생성
안드로이드 스튜디오에서 적당한 이름으로 프로젝트를 하나 생성합니다.
2.2 Layout 작성
activity_main.xml
중력 센서가 보내오는 x, y, z축의 m/s2 값들을 출력할 수 있는 TextView를 작성합니다.
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gravity Sensor" android:layout_marginTop="50dp" android:textSize="30dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tvXaxis" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/tvTitle" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:textSize="25dp" android:text="X axis : 0" /> <TextView android:id="@+id/tvYaxis" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/tvXaxis" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:textSize="25dp" android:text="Y axis : 0" /> <TextView android:id="@+id/tvZaxis" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/tvYaxis" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:textSize="25dp" android:text="Z axis : 0" /> <TextView android:id="@+id/tvGravity" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/tvZaxis" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:textSize="25dp" android:text="Total Gravity : 0" /> </android.support.constraint.ConstraintLayout>
2.3 Java Source
MainActivity.java
소스를 보면 알겠지만 기존 센서와 동일한 프로세스로 작동이 됩니다.
핸드폰이 움직일 때 마다 각 축으로부터 받는 중력을 합한 중력 총량을 구합니다.
package com.example.desk.sensorgravity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; private Sensor gravitySensor; private double total; TextView tvXaxis, tvYaxis, tvZaxis, tvGravity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvXaxis = (TextView)findViewById(R.id.tvXaxis); tvYaxis = (TextView)findViewById(R.id.tvYaxis); tvZaxis = (TextView)findViewById(R.id.tvZaxis); tvGravity = (TextView)findViewById(R.id.tvGravity); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, gravitySensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { if(event.sensor == gravitySensor) { total = Math.sqrt(Math.pow(event.values[0],2) + Math.pow(event.values[1], 2) + Math.pow(event.values[2] , 2)); tvXaxis.setText("X axis : " + String.format("%.2f", event.values[0])); tvYaxis.setText("Y axis : " + String.format("%.2f", event.values[1])); tvZaxis.setText("Z axis : " + String.format("%.2f", event.values[2])); tvGravity.setText("Total Gravity : " + String.format("%.2f", total) + " m/s\u00B2"); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }
3. 결과
3.1 결과 화면
핸드폰을 평평한 곳에 놓았을 때나 흔들고 이동을 하여도 전체 중력 값은 동일한 것을
확인 할 수 있습니다.
3.2 Source Code
3.3 APK File
- copy coding -
'Android' 카테고리의 다른 글
android GPS,Network 이용 좌표 얻기 (GPS_PROVIDER, NETWORK_PROVIDER) (4) | 2018.11.19 |
---|---|
안드로이드 진동 센서 테스트 (VIBRATOR_SERVICE) (0) | 2018.10.31 |
안드로이드 가속도 센서 비교 (TYPE_ACCELEROMETER/TYPE_LINEAR_ACCELERATION) (2) | 2018.10.13 |
안드로이드 자기장 센서/금속 탐지기 테스트 (TYPE_MAGNETIC_FIELD) (0) | 2018.10.09 |
안드로이드 장치의 회전 방향 확인 (TYPE_GYROSCOPE) (0) | 2018.10.01 |