본문 바로가기

안드로이드

센서

반응형
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