https://source.android.google.cn/devices/sensors/sensor-types?hl=ko
센서는 부가적으로 사용성을 높이는데 큰 도움을 주는 요소이다
안드로이드에서는 다용한 표준 센서들을 지원하고, 대표적으로 가속 센서는 다양한 기준 축(Axe)을 따라 기기가 얼마만큼의 속도로 움직이는지 측정할게 있게 한다
자이로스코프 센서(Gyroscope)는 가속 센서보다 더 많은 축을 기준으로 시간에 따라 회전하는 정보까지 확인할 수 있도록 해준다
이 외에도 다양한 센서들이 지원되는데, 센서 매니저라는 시스템 서비스를 통해 모두 같은 방식으로 사용할 수 있다
(가속, 자이로스코프, 중력, 조도, 선형 가속, 근접, 온도, 방향)
가속 센서의 경우에는 중력 정보와 선형 가속 정보가 같이 계산되므로 가장 자주 사용되는 센서 중의 하나이다
가속 센서를 이해하기 위해서는 가속 센서의 값을 계산할 줄 알아야 한다
단말을 테이블 위에 놓아두었을 경우에는 가속 센서의 값은 +9.81이 된다
방향은 X축으로는 오른쪽이 +값, Y축으로는 위쪽이 +값, Z축으로는 화면 앞쪽이 +값이다
방향 센서는 세 가의 값을 전달 받을 수 있는데, 첫 번째 값은 Azimuth라 하고 Z축을 기준으로 북쪽 방향과 현재 감지되는 Y축과의 차이를 나타낸다
값의 범위는 0도부터 359도 사이가 되고 각각 방위 값은 0 = 북쪽, 90 = 동쪽, 180 = 남쪽, 270 = 서쪽이 된다
두 번째 값은 Pitch라 하고 X축을 기준으로 한 회전각을 나타낸다
값의 범위는 -180도부터 180도 사이가 되고 Z축이 Y축 방향으로 이동할 때 +값이 된다
세 번째 값은 Roll이라 하고 Y축을 기준으로 한 회전각을 나타낸다
값의 범위는 -90도부터 90도까지가 되고 X축이 Z축 방향으로 이동할 때 +값이 된다
SensorManager
센서를 다루기 위해 제공되는 시스템 서비스 객체
각 센서 정보를 포함
Sensor
SensorEvent
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="센서 리스트" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="첫번째 센서" />
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
MainActivity
package com.example.a84_sensor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView textView;
SensorManager manager;
List<Sensor> sensors;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getSensorList();
}
});
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
registerFirstSensor();
}
});
}
public void registerFirstSensor() {
// 센서를 위한 리스너 설정
// registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs)
manager.registerListener(new SensorEventListener() {
// 센서의 데이터 값이 변할때마다 호출
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// timestemp - 센서에서 값을 확인한 시간
// accuracy - 값을 확인할 때의 센서 정확도
// value - float 타입의 배열, 센소의 종류에 따라 여러 개의 값을 갖고 있음
String output = "Sensor Timestamp : " + sensorEvent.timestamp + "\n\n";
for (int index = 0; index < sensorEvent.values.length; ++index) {
output += ("Sensor Value #" + (index + 1) + " : " + sensorEvent.values[index] + "\n");
}
println(output);
}
// 센서의 정확도 값이 변할때마다 호출
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}, sensors.get(0), SensorManager.SENSOR_DELAY_UI);
}
public void getSensorList() {
// SensorManager 객체 참조
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 단말에서 지원하는 모든 센서 리스트 가져오기
sensors = manager.getSensorList(Sensor.TYPE_ALL);
int index = 0;
for (Sensor sensor : sensors) {
println("#" + index + " : " + sensor.getName());
}
}
public void println(String data) {
textView.append(data + "\n");
}
}
'안드로이드' 카테고리의 다른 글
시스템 서비스 (0) | 2021.11.11 |
---|---|
푸시 서비스 사용하기 - 메세지 전송 앱 만들기 (0) | 2021.11.10 |
푸시 서비스 사용하기 (0) | 2021.11.10 |
상단 알림으로 알려주기 (0) | 2021.11.10 |
진동과 소리로 알려주기 (0) | 2021.11.10 |