마스터 안드로이드 센서 : 하드웨어, 소프트웨어 및 다차원

작가: John Stephens
창조 날짜: 26 1 월 2021
업데이트 날짜: 5 칠월 2024
Anonim
윤대리_아두이노_블루투스_앱인벤터_센서값_동작모듈_레이블
동영상: 윤대리_아두이노_블루투스_앱인벤터_센서값_동작모듈_레이블

콘텐츠


오늘날 대부분의 최신 Android 기기에는 많은 센서가 장착되어 있습니다.

이 정보는 여러 가지 방식으로 사용할 수 있습니다. 응용 프로그램에서 밝기 나 색상 구성표를 자동으로 조정할 수 있도록 조명 수준을 모니터링하는지 여부입니다. 사용자가 장치를 기울이는 것과 같은 제스처를 사용하여 모바일 게임과 상호 작용할 수 있도록합니다. 또는 근접 센서를 사용하여 사용자가 장치를 귀에 대고있을 때마다 터치 이벤트를 자동으로 비활성화합니다.

이 기사에서는 다양한 하드웨어 및 소프트웨어 센서에서 빛, 근접성 및 모션 데이터를 검색하는 세 가지 애플리케이션을 작성합니다. 또한 이러한 Android 센서를 실시간으로 모니터링하므로 응용 프로그램은 항상 최신 정보에 액세스 할 수 있습니다.

이 기사의 끝 부분에서는 Android 센서에서 단일 데이터를 추출하는 방법과 데이터를 다차원 배열 형태로 제공하는 센서를 처리하는 방법에 대해 알아 봅니다.

어떤 Android 센서를 사용할 수 있습니까?

안드로이드 센서는 다음과 같은 범주로 나눌 수 있습니다.

  • 환경 센서. 대기 온도, 압력, 습도 및 주변 조명 수준과 같은 환경 조건을 측정합니다.

  • 위치 센서. 이 범주에는 근접 센서 및 지 자기장 센서와 같이 장치의 물리적 위치를 측정하는 센서가 포함됩니다.
    모션 센서. 이 센서는 장치 동작을 측정하며 가속도계, 중력 센서, 자이로 스코프 및 회전 벡터 센서를 포함합니다.

또한 센서는 다음 중 하나 일 수 있습니다.


  • 하드웨어 기반. 이들은 장치에 내장되어 있으며 주변 지 자기장의 가속 또는 강도와 같은 특정 속성을 직접 측정하는 물리적 구성 요소입니다.
  • 가상 센서 또는 복합 센서라고도하는 소프트웨어 기반. 이들은 일반적으로 여러 하드웨어 기반 센서에서 데이터를 수집합니다. 이 기사의 끝 부분에서 장치의 가속도계, 자력계 및 자이로 스코프의 데이터를 결합하는 소프트웨어 센서 인 회전 벡터 센서를 사용할 것입니다.

환경 센서 : 주변 광 측정

Android의 광 센서는 사람의 눈으로 감지되는 빛의 강도 인“럭스”단위로 주변 광을 측정합니다. 센서가보고하는 럭스 값은 장치마다 다를 수 있으므로 응용 프로그램에 일관된 값이 필요한 경우 응용 프로그램에서 원시 데이터를 사용하기 전에 조작해야합니다.

이 섹션에서는 장치의 조도 센서에서 현재 럭스 값을 검색하여 TextView에 표시 한 다음 새 데이터를 사용할 수있게되면 TextView를 업데이트하는 응용 프로그램을 작성합니다.그런 다음이 정보를 다양한 앱에서 사용할 수 있습니다. 예를 들어, 라이트 센서에서 정보를 가져 와서 현재 라이트 레벨에 따라 빔의 강도를 자동으로 조정하는 토치 애플리케이션을 만들 수 있습니다.

원하는 설정으로 새 Android 프로젝트를 만들고 시작하겠습니다.

센서 데이터 표시

이제 조명 센서에서 추출한 데이터를 표시하는 TextView를 추가하겠습니다. 이 TextView는 새 데이터를 사용할 수있게 될 때마다 업데이트되므로 사용자는 항상 최신 정보에 액세스 할 수 있습니다.

프로젝트의 activity_main.xml 파일을 열고 다음을 추가하십시오.

다음으로 레이아웃에서 참조되는 "light_sensor"문자열 리소스를 만들어야합니다. 프로젝트의 strings.xml 파일을 열고 다음을 추가하십시오.


광 센서 : % 1 $ .2f

“% 1 $ .2f”는 표시하려는 정보와 형식을 지정하는 방법을 지정하는 자리 표시 자입니다.

  • %1. 동일한 문자열 리소스에 여러 자리 표시자를 삽입 할 수 있습니다. "% 1"은 단일 자리 표시자를 사용하고 있음을 나타냅니다.
  • $.2. 이것은 우리의 어플리케이션이 각각의 들어오는 부동 소수점 값을 어떻게 포맷해야하는지 지정합니다. “$ .2”는 값이 소수점 이하 두 자리로 반올림되어야 함을 나타냅니다.
  • 에프. 값을 부동 소수점 숫자로 형식화하십시오.

일부 센서는 다른 센서보다 일반적이지만 모든 장치가 동일한 하드웨어 및 소프트웨어에 액세스 할 수 있다고 가정해서는 안됩니다. 센서 사용 가능 여부는 Android 버전이 출시 될 때까지 일부 센서가 도입되지 않았기 때문에 Android 버전에 따라 다를 수 있습니다.

Android 센서 프레임 워크를 사용하여 특정 센서가 장치에 있는지 확인할 수 있습니다. 그런 다음 센서 가용성에 따라 응용 프로그램의 일부를 비활성화하거나 활성화하거나 일부 응용 프로그램 기능이 예상대로 작동하지 않는다는 설명을 표시 할 수 있습니다.

strings.xml 파일을 연 상태에서 조명 센서를 사용할 수없는 경우 표시되는“no_sensor”문자열을 만들어 보겠습니다.

사용 가능한 광 센서가 없음

응용 프로그램이 특정 센서에 액세스하지 않고도 우수한 사용자 환경을 제공 할 수없는 경우이 정보를 매니페스트에 추가해야합니다. 예를 들어 앱에서 나침반 센서에 액세스해야하는 경우 다음을 사용할 수 있습니다.

이제 앱을 나침반 센서가있는 기기로만 다운로드 할 수 있습니다.

이로 인해 잠재 고객이 제한 될 수 있지만 사용자가 애플리케이션을 다운로드 할 때 다른 사람이 애플리케이션을 다운로드하도록 허용하는 것보다 피해가 훨씬 적습니다. 보장 기기의 센서 구성으로 인해 경험이 좋지 않습니다.

센서와 통신 : SensorManager, SensorEvents 및 리스너

기기의 광 센서와 통신하려면 다음 단계를 완료해야합니다.

1. SensorManager 인스턴스 확보

SensorManager는 장치의 모든 센서에 액세스하는 데 필요한 모든 방법을 제공합니다.

시작하려면 SensorManager 인스턴스를 보유 할 변수를 만듭니다.

개인 SensorManager lightSensorManager;

그런 다음 Context.getSystemService 메소드를 호출하고 Context.SENSOR_SERVICE 인수를 전달하여 SensorManager의 인스턴스를 가져와야합니다.

lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE);

2. lightTextView에 대한 참조를 얻습니다.

다음으로 TextView 객체를 보유하고 TextView에 할당 할 비공개 멤버 변수를 만들어야합니다.

개인 TextView lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. 센서가 현재 장치에 존재하는지 확인

getDefaultSensor () 메소드를 호출 한 다음 해당 센서를 전달하여 특정 센서에 액세스 할 수 있습니다. 광 센서의 유형 상수는 TYPE_LIGHT이므로 다음을 사용해야합니다.

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

이 장치에 센서가 없으면 getDefaultSensor () 메소드가 null을 반환하고 "no_sensor"문자열을 표시합니다.

문자열 sensor_error = getResources (). getString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }}

4. 센서 리스너 등록

센서에 새로운 데이터가있을 때마다 Android는 SensorEvent 객체를 생성합니다. 이 SensorEvent 객체에는 이벤트, 타임 스탬프 및 새 데이터 값을 생성 한 센서가 포함됩니다.

처음에는 단일 데이터를 반환하는 조명 및 근접 센서에 중점을 둘 것입니다. 그러나 일부 센서는이 기사의 끝 부분에서 살펴볼 회전 벡터 센서를 포함하여 각 SensorEvent에 대해 다차원 배열을 제공합니다.

애플리케이션에 이러한 SensorEvent 객체에 대한 알림을 받으려면 SensorManager의 registerListener ()를 사용하여 해당 특정 센서 이벤트에 대한 리스너를 등록해야합니다.

registerListener () 메소드는 다음 인수를 사용합니다.

  • 앱 또는 활동 컨텍스트.
  • 모니터링하려는 센서 유형입니다.
  • 센서가 새 데이터를 보내야하는 속도. 더 높은 속도는 애플리케이션에 더 많은 데이터를 제공하지만 더 많은 시스템 리소스, 특히 배터리 수명을 사용합니다. 기기의 배터리를 보존하려면 애플리케이션에 필요한 최소량의 데이터를 요청해야합니다. 200,000 마이크로 초 (0.2 초)마다 한 번씩 새 데이터를 보내는 SensorManager.SENSOR_DELAY_NORMAL을 사용하겠습니다.

센서를 들으면 기기의 배터리가 소모되므로 애플리케이션의 onCreate () 메소드에 리스너를 등록하면 안됩니다. 애플리케이션이 백그라운드에 있어도 센서가 데이터를 계속 전송하게됩니다.

대신 애플리케이션의 onStart () 수명주기 메소드에 센서를 등록해야합니다.

@Override protected void onStart () {super.onStart (); // 현재 장치에서 센서를 사용할 수있는 경우 ... // if (lightSensor! = null) {//…. 그러면 청취 시작 // lightSensorManager.registerListener (this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. SensorEventListener 콜백 구현

SensorEventListener는 SensorManager로부터 알림을받는 인터페이스입니다.
새 데이터를 사용할 수 있거나 센서의 정확도가 변경 될 때마다

첫 번째 단계는 SensorEventListener 인터페이스를 구현하기 위해 클래스 서명을 수정하는 것입니다.

공개 클래스 MainActivity는 AppCompatActivity를 확장하여 SensorEventListener를 구현합니다. {

그런 다음 다음 콜백 메소드를 구현해야합니다.

onSensorChanged ()

이 메소드는 각각의 새 SensorEvent에 대한 응답으로 호출됩니다.

센서 데이터는 종종 빠르게 변경 될 수 있으므로 애플리케이션이 정기적으로 onSensorChanged () 메소드를 호출 할 수 있습니다. 응용 프로그램이 원활하게 실행되도록하려면 onSensorChanged () 메서드 내에서 가능한 한 적은 작업을 수행해야합니다.

@void public void onSensorChanged (SensorEvent sensorEvent) {// 할 일 //}

onAccuracyChanged ()

센서의 정확도가 향상되거나 감소하면 Android는 onAccuracyChanged () 메서드를 호출하고 SENSOR_STATUS_UNRELIABLE 또는 SENSOR_STATUS_ACCURACY_HIGH와 같은 새로운 정확도 값이 포함 된 Sensor 객체를 전달합니다.

광 센서는 정확도 변화를보고하지 않으므로 onAccuracyChanged () 콜백을 비워 두겠습니다.

@void public void onAccuracyChanged (센서 센서, int i) 재정의 {// 할 일 //}}

6. 센서 값을 검색

새로운 값을 가질 때마다 onSensorChanged () 메소드를 호출하고 "light_sensor"문자열을 검색해야합니다. 그런 다음 문자열의 자리 표시 자 텍스트 (% 1 $ .2f)를 재정의하고 TextView의 일부로 업데이트 된 문자열을 표시 할 수 있습니다.

@Override public void onSensorChanged (SensorEvent sensorEvent) {// 센서의 현재 값 // float currentValue = sensorEvent.values; // "light_sensor"문자열을 검색하여 새 값을 삽입하여 사용자에게 표시합니다 .// lightTextView.setText (getResources (). getString (R.string.light_sensor, currentValue)); }

7. 청취자 등록 해제

센서는 짧은 시간에 많은 양의 데이터를 생성 할 수 있으므로 더 이상 필요하지 않은 청취자를 등록 취소해야하는 장치의 리소스를 보존 할 수 있습니다.

애플리케이션이 백그라운드에있을 때 센서 이벤트 수신을 중지하려면 프로젝트의 onStop () 라이프 사이클 메소드에 unregisterListener ()를 추가하십시오.

@Override protected void onStop () {super.onStop (); lightSensorManager.unregisterListener (this); }

Android 7.0 이상에서 애플리케이션은 일시 중지 상태이지만 화면에 표시되는 분할 화면 및 PIP 모드에서 실행될 수 있으므로 onPause ()에서 리스너의 등록을 해제하면 안됩니다.

Android의 광 센서 사용 : 완성 된 코드

위의 모든 단계를 완료 한 후 프로젝트의 MainActivity는 다음과 같아야합니다.

import android.support.v7.app.AppCompatActivity; android.os.Bundle 가져 오기; import android.content.Context; android.hardware.Sensor 가져 오기; android.hardware.SensorEvent 가져 오기; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.widget.TextView; 공용 클래스 MainActivity 확장 AppCompatActivity // SensorEventListener 인터페이스 구현 // SensorEventListener 구현 {// 변수 만들기 // private Sensor lightSensor; 개인 SensorManager lightSensorManager; 개인 TextView lightTextView; @Override protected void onCreate (번들 저장 인스턴스 상태) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // SensorManager의 인스턴스를 가져옵니다 // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // 광 센서 확인 // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // 광 센서가 없으면 오류를 표시합니다. // String sensor_error = getResources (). getString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @Override protected void onStart () {super.onStart (); // 현재 장치에서 센서를 사용할 수있는 경우 ... // if (lightSensor! = null) {//…. 그런 다음 리스너 등록 // lightSensorManager.registerListener (this, lightSensor, // 원하는 빈도 지정 새로운 데이터 수신 // SensorManager.SENSOR_DELAY_NORMAL); }} @protected void 무효화 onStop () {super.onStop (); // 리스너 등록 해제 // lightSensorManager.unregisterListener (this); } @void public void onSensorChanged (SensorEvent sensorEvent) {// 센서의 현재 값 // float currentValue = sensorEvent.values; // "light_sensor"문자열을 검색하고 새 값을 삽입 한 후 TextView // lightTextView.setText (getResources (). getString (R.string.light_sensor, currentValue)); } @Override // 센서의 정확도가 변경되면… .// public void onAccuracyChanged (센서 센서, int i) {// TO DO //}}

완성 된 Android 센서 앱 테스트

실제 Android 스마트 폰 또는 태블릿에서이 애플리케이션을 테스트하려면 다음을 수행하십시오.

  • 기기에 프로젝트를 설치하십시오 (Android Studio 도구 모음에서 "실행> 실행"을 선택하여).
  • 장치마다 다르지만 광 센서는 종종 화면 오른쪽 상단에 있습니다. 조명 수준을 조작하려면 장치를 광원에 더 가깝게 옮기고 광원에서 멀리 떨어 뜨려 놓으십시오. 또는 손으로 장치를 가리고 빛을 차단 해보십시오. "조명 센서"값은 사용 가능한 빛의 양에 따라 증가 및 감소해야합니다.

AVD (Android Virtual Device)를 사용하는 경우 에뮬레이터에는 다양한 센서 이벤트를 시뮬레이션하는 데 사용할 수있는 가상 센서 컨트롤 세트가 있습니다. 에뮬레이터의 "확장 컨트롤"창을 통해 이러한 가상 센서 컨트롤에 액세스합니다.

  • AVD에 응용 프로그램을 설치하십시오.
  • AVD와 함께 버튼 스트립이 표시됩니다. 커서가 다음 스크린 샷에있는 3 점 "기타"버튼을 찾아 클릭하십시오. “Extended Controls”창이 시작됩니다.

  • 왼쪽 메뉴에서 "가상 센서"를 선택하십시오.
  • "추가 센서"탭을 선택하십시오. 이 탭에는 다양한 위치 및 환경 센서 이벤트를 시뮬레이션하는 데 사용할 수있는 다양한 슬라이더가 있습니다.

  • “조명 (럭스)”슬라이더를 찾아서 왼쪽과 오른쪽으로 드래그하여 시뮬레이션 된 조명 수준을 변경하십시오. 애플리케이션은 이러한 변경 값을 실시간으로 표시해야합니다.

완성 된 프로젝트는 GitHub에서 다운로드 할 수 있습니다.

Android의 근접 센서로 거리 측정

이제 환경 센서에서 정보를 검색하는 방법을 살펴 보았습니다.이 지식을 환경 센서에 적용하는 방법을 살펴 보겠습니다. 위치 감지기.

이 섹션에서는 기기의 근접 센서를 사용하여 스마트 폰 또는 태블릿과 다른 물체 사이의 거리를 모니터링합니다. 응용 프로그램에 어떤 종류의 음성 기능이있는 경우 근접 센서를 통해 스마트 폰이 사용자의 귀에 들리는 시점 (예 : 전화 통화를하는 시점)을 확인할 수 있습니다. 그런 다음이 정보를 사용하여 터치 이벤트를 비활성화 할 수 있으므로 사용자가 실수로 전화를 끊거나 대화 도중에 원하지 않는 다른 이벤트를 트리거하지 않습니다.

사용자 인터페이스 만들기

근접 데이터를 화면에 표시하여 실시간으로 업데이트되는 것을 볼 수 있습니다. 일을 단순하게 유지하기 위해 이전 응용 프로그램의 레이아웃을 대부분 재사용하십시오.

다음으로, strings.xml 파일을 열고“proximity_sensor”문자열을 작성하십시오. 다시이 문자열은 자리 표시자를 포함해야하며,이 결과는 근접 센서에서 추출 된 데이터로 채워집니다.

근접 센서 근접 센서 : % 1 $ .2f 근접 센서 없음

근접 센서에서 데이터 가져 오기

광 센서와 유사하게 Android의 근접 센서는 단일 데이터 값을 반환하므로 이전 애플리케이션의 많은 코드를 재사용 할 수 있습니다. 그러나 몇 가지 주요 차이점과이 코드를 쉽게 따라갈 수있는 이름 관련 변경 사항이 있습니다.

  • 이번에는 "proximitySensorManager"라는 이름으로 SensorManager 인스턴스를 만듭니다.
  • "proximitySensorManager"의 인스턴스를 확보하십시오.
  • "proximityTextView"에 대한 참조를 작성하십시오.
  • getDefaultSensor () 메소드를 호출하고 TYPE_PROXIMITY 센서에 전달하십시오.
  • 근접 센서의 리스너를 등록 및 등록 해제합니다.

이러한 조정을 마친 후에는 다음과 같이 끝나야합니다.

import android.support.v7.app.AppCompatActivity; android.os.Bundle 가져 오기; import android.content.Context; android.hardware.Sensor 가져 오기; android.hardware.SensorEvent 가져 오기; import android.hardware.SensorManager; import android.hardware.SensorEventListener; import android.widget.TextView; public class MainActivity 확장 AppCompatActivity // SensorEventListener 인터페이스 구현 // SensorEventListener 구현 {// 변수 만들기 // private Sensor 근접 센서; 개인 센서 관리자 근접 센서 관리자; 개인 TextView 근접 텍스트보기; @Override protected void onCreate (번들 저장 인스턴스 상태) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); 근접 텍스트보기 = (텍스트보기) findViewById (R.id.proximityTextView); // SensorManager의 인스턴스를 가져옵니다 // 근접성 SensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // 근접 센서 확인 // 근접 근접 센서 = 근접 센서 센서 .getDefaultSensor (Sensor.TYPE_PROXIMITY); // 근접 센서가 없으면 오류를 표시합니다. // String sensor_error = getResources (). getString (R.string.no_sensor); if (proximitySensor == null) {근접성 텍스트보기 .setText (sensor_error); }} @Override protected void onStart () {super.onStart (); // 현재 장치에서 센서를 사용할 수있는 경우 ... // if (proximitySensor! = null) {//…. 그런 다음 리스너 등록 //closesensorManager.registerListener(this, closeupSensor, // 원하는 빈도 지정 새로운 데이터 수신 // SensorManager.SENSOR_DELAY_NORMAL); }} @protected void 무효화 onStop () {super.onStop (); // 시스템 리소스를 보존하기 위해 리스너 등록을 취소합니다 .// 근접성 SensorManager.unregisterListener (this); } @void public void onSensorChanged (SensorEvent sensorEvent) {// 센서의 현재 값 // float currentValue = sensorEvent.values; //“proximity_sensor”문자열을 검색하고 새 값을 삽입 한 후 TextView // 근접성 TextView.setText (getResources (). getString (R.string.proximity_sensor, currentValue)); } @Override // 센서의 정확도가 변경되면… .// public void onAccuracyChanged (센서 센서, int i) {//...TO DO //}}

테스트 : 사용자가 기기와 얼마나 가깝습니까?

이 응용 프로그램을 실제 Android 스마트 폰 또는 태블릿에서 테스트하려면 장치에 응용 프로그램을 설치 한 다음 화면을 향해 손을 움직 인 다음 다시 옮기십시오. "근접 센서"값은 움직임을 기록해야합니다.

근접 센서는 장치마다 다를 수 있습니다. 일부 기기는 두 개의 근접 값만 표시 할 수 있습니다. 하나는 "근처"를 나타내고 다른 하나는 "Far"를 나타냅니다. 따라서 실제 Android 기기에서 다양한 종류가 보이지 않는 경우 놀라지 마십시오.

에뮬레이터에서이 응용 프로그램을 테스트하려면

  • AVD에 응용 프로그램을 설치하십시오.
  • 세 점으로 된 "추가"버튼을 찾아 클릭하면 "확장 컨트롤"창이 시작됩니다.
  • 창의 왼쪽 메뉴에서 "가상 센서"를 선택하십시오.
  • "추가 센서"탭을 선택하십시오.
  • “근접”슬라이더를 찾아 왼쪽과 오른쪽으로 드래그하여 장치에 더 가까이 이동 한 다음 더 멀어지는 물체를 에뮬레이션하십시오. 슬라이더를 조작 할 때 "근접 센서"값이 변경되어야합니다.

완성 된 프로젝트는 GitHub에서 다운로드 할 수 있습니다.

모션 센서 : 다차원 어레이 처리

지금까지는 단일 데이터 항목을 제공하는 센서에 중점을 두었지만 각 SensorEvent에 대해 다차원 배열을 제공하는 일부 센서가 있습니다. 이 다차원 센서에는 모션 센서가 포함되어 있으며이 섹션에서 중점적으로 다룰 것입니다.

모션 센서가 도움이 될 수 있습니다.

  • 다른 사용자 입력 방법을 제공하십시오. 예를 들어 모바일 게임을 개발하는 경우 사용자는 기기를 기울여 화면 주위로 캐릭터를 움직일 수 있습니다.
  • 사용자 활동을 유추하십시오. 활동 추적 앱을 만든 경우 모션 센서를 통해 사용자가 자동차를 타고 여행하는지, 조깅을하거나 책상에 앉아 있는지 측정 할 수 있습니다.
  • 방향을보다 정확하게 결정하십시오.기기의 모션 센서에서 좌표를 추출한 다음 지구의 좌표계를 기반으로 변환하여 기기의 현재 방향에 대한 가장 정확한 통찰력을 얻을 수 있습니다.

이 마지막 섹션에서는 회전 벡터 센서 (TYPE_ROTATION_VECTOR)를 사용합니다. 조명 및 근접 센서와 달리이 장치는 장치의 가속도계, 자력계 및 자이로 스코프 센서에서 데이터를 수집하는 소프트웨어 센서입니다. 이 센서를 사용하려면 종종 수학적 변환 및 변환을 수행해야하지만 장치에 대한 매우 정확한 정보를 제공 할 수도 있습니다.

회전 벡터 센서를 사용하여 다음을 측정하는 응용 프로그램을 만들 것입니다.

  • 피치. 이것은 장치의 위에서 아래로 기울입니다.
  • 롤. 이것은 장치의 왼쪽에서 오른쪽으로 기울입니다.

실시간 피치 및 롤 데이터 표시

두 개의 측정 항목을 측정하고 있으므로 두 개의 TextView와 두 개의 해당 문자열 리소스를 만들어야합니다.

strings.xml 파일을 열고 다음을 추가하십시오.

모션 센서 피치 센서 : % 1 $ .2f 롤 센서 : % 1 $ .2f 모션 센서가 없습니다.

앱에서 회전 벡터 센서 사용

이전 애플리케이션의 일부 코드를 재사용 할 예정이므로 회전 벡터 센서와 통신하는 영역에 초점을 맞추고 이전과 크게 다른 부분을 살펴 보겠습니다.

1. TYPE_ROTATION_VECTOR를 사용하십시오.

회전 벡터 센서를 사용하고 있으므로 getDefaultSensor () 메소드를 호출 한 다음 TYPE_ROTATION_VECTOR 상수를 전달해야합니다.

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. 센서 데이터 번역

이전의 광 및 근접 센서와 달리 모션 센서는 모든 SensorEvent에 대해 다차원 센서 값 배열을 반환합니다. 이 값은 표준“X, Y, Z”좌표 시스템을 사용하여 형식이 지정되며 기본“자연”방향으로 고정 된 경우 장치를 기준으로 계산됩니다.

Android는 기기의 현재 방향과 일치하도록 이러한 X, Y 및 Z 좌표를 전환하지 않으므로 기기가 세로 모드인지 가로 모드인지에 관계없이 "X"축은 동일하게 유지됩니다. 회전 벡터 센서를 사용하는 경우 장치의 현재 회전과 일치하도록 수신 데이터를 변환해야 할 수 있습니다.

세로는 대부분의 스마트 폰에서 기본 방향이지만,이 경우에 해당한다고 가정해서는 안됩니다. 모든 Android 기기, 특히 태블릿 이 기사에서는 회전 행렬을 사용하여 센서 데이터를 원래 데이터에서 변환합니다. 장치 좌표계 지구 지구를 기준으로 한 장치의 움직임과 위치를 나타내는 좌표계. 필요한 경우 기기의 현재 방향에 따라 센서 데이터를 다시 매핑 할 수 있습니다.

먼저, 장치 좌표계는 표준 3 축 X, Y, Z 좌표계이며, 여기서 3 개의 축 각각의 각 점은 3D 벡터로 표시됩니다. 즉, 9 개의 float 값으로 구성된 배열을 만들어야합니다.

float rotationMatrix = 새로운 플로트;

그런 다음이 배열을 getRotationMatrix () 메소드에 전달할 수 있습니다.

SensorManager.getRotationMatrixFromVector (rotationMatrix, 벡터); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

다음 단계는 SensorManager.remapCoordinateSystem () 메소드를 사용하여 장치의 현재 방향에 따라 센서 데이터를 다시 매핑하는 것입니다.

SensorManager.remapCoordinateSystem () 메소드는 다음 인수를 사용합니다.

  • 원래 회전 행렬.
  • 다시 매핑 할 축입니다.
  • 이 새 데이터로 채우려는 배열입니다.

내 앱에서 사용할 코드는 다음과 같습니다.

float adjustRotationMatrix = 새로운 플로트; SensorManager.remapCoordinateSystem (rotationMatrix, worldAxisX, worldAxisZ, 조정 된 회전 행렬);

마지막으로 SensorManager.getOrientation을 호출하여 조정 된 회전 매트릭스를 사용하도록 지시합니다.

SensorManager.getOrientation (조정 된 회전 행렬, 방향);

3. 자리 표시 자 문자열 업데이트

두 개의 데이터 세트 (피치 및 롤)가 있으므로 두 개의 개별 자리 표시 자 문자열을 검색하여 올바른 값으로 채운 다음 해당 TextView를 업데이트해야합니다.

pitchTextView.setText (getResources (). getString (R.string.pitch_sensor, 피치)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll));

여러 센서 데이터 표시 : 완성 된 코드

위 단계를 수행 한 후 MainActivity는 다음과 같아야합니다.

import android.app.Activity; android.os.Bundle 가져 오기; android.hardware.Sensor 가져 오기; android.hardware.SensorEvent 가져 오기; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.widget.TextView; 공개 클래스 MainActivity 확장 활동 구현 구현 SensorEventListener {private SensorManager motionSensorManager; 개인용 센서 motionSensor; 개인 TextView pitchTextView; 개인 TextView rollTextView; private static final int SENSOR_DELAY = 500 * 1000; private static final int FROM_RADS_TO_DEGS = -57; @Override protected void onCreate (번들 저장 인스턴스 상태) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); 시도 {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (this, motionSensor, SENSOR_DELAY); } catch (예외 e) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Public void onAccuracyChanged (센서 센서, int 정확도) 무시 {//해야 할 일 //} @Override public void onSensorChanged (SensorEvent event) {if (event.sensor == motionSensor) {update (event.values); }} private void update (float vectors) {// 회전 행렬 계산 // float rotationMatrix = new float; SensorManager.getRotationMatrixFromVector (rotationMatrix, 벡터); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // 활동의 현재 방향을 기준으로 행렬을 다시 매핑합니다 .// float 조정 된 RotationMatrix = new float; SensorManager.remapCoordinateSystem (rotationMatrix, worldAxisX, worldAxisZ, 조정 된 회전 행렬); // 장치 방향을 계산합니다 .// float 방향 = new float; // float 값의 배열을 getOrientation () 메서드에 제공합니다 .// SensorManager.getOrientation (adjustedRotationMatrix, orientation); 플로트 피치 = 방향 * FROM_RADS_TO_DEGS; 플로트 롤 = 방향 * FROM_RADS_TO_DEGS; // 피치 및 롤 값으로 TextView를 업데이트합니다 .// pitchTextView.setText (getResources (). getString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

완성 된 프로젝트는 GitHub에서 다운로드 할 수 있습니다.

최종 Android 센서 애플리케이션 테스트

실제 Android 스마트 폰 또는 태블릿에서이 회전 벡터 Android 센서 앱을 테스트하려면

  • 장치에 응용 프로그램을 설치하십시오.
  • 스마트 폰 또는 태블릿을 평평한 곳에 놓으십시오. 모션 센서는 매우 민감하므로 모션이없는 것처럼 보이는 장치가 피치 및 롤 값의 변동을보고하는 것은 드문 일이 아닙니다.
  • 피치를 테스트하려면 장치의 바닥을 들어 올려 기울어지지 않도록하십시오. 피치 값이 크게 변경되어야합니다.
  • 롤을 테스트하려면 장치의 왼쪽을 들어 올려 왼쪽으로 기울입니다. 롤 값을 주시하십시오!

에뮬레이터에서 프로젝트를 테스트하는 경우 :

  • AVD에 응용 프로그램을 설치하십시오.
  • “Extended Controls”창이 시작되는“More”를 선택하십시오.
  • 왼쪽 메뉴에서 "가상 센서"를 선택하십시오.
  • "가속도계"탭이 선택되어 있는지 확인하십시오. 이 탭에는 기기의 위치와 방향의 변화를 시뮬레이션 할 수있는 컨트롤이 있습니다.
  • 다양한 슬라이더 (회전 : Z-Rot, X-Rot, Y-Rot 및 이동 : X, Y 및 Z)와 다양한 "장치 회전"버튼을 사용하여 응용 프로그램의 "롤 센서"에 미치는 영향을 확인하십시오. "및"피치 센서 "값.

마무리

이 기사에서는 Android 센서의 세 가지 주요 범주 인 환경, 위치 및 모션에서 데이터를 검색하는 방법과이 데이터를 실시간으로 모니터링하는 방법을 살펴 보았습니다.

흥미 롭거나 독특한 방식으로 센서를 사용하는 Android 앱을 본 적이 있습니까? 아래 의견에 알려주십시오!

Netflix의 거대한 영화 카탈로그는 전 세계에서 가장 인기있는 스트리밍 서비스가되었으며, 수백만 명의 사람들이 전화, TV, 태블릿, 데스크톱, 게임 콘솔 등에서 끝없는 시간의 콘텐츠를 시청하도록 서명했습니다.끊임없이 새로 워진 Netflix 라이브러리는 선택할 수있는 많은 놀라운 영화를 제공하며 모든 종류의 영화 팬을 수용합니다. 여기에는 항상 인기있...

훌루 (Hulu)는 카탈로그를 서서히 확장했으며 이는 공상 과학 영화 및 쇼 팬들에게 희소식입니다. 훌루는 더 저렴한 넷플릭스 였지만 요즘 훌루 오리지널 쇼는 경기장의 수준을 크게 높였습니다. 훌루에서 공상 과학에 관해서는 많은 옵션이 있습니다. 고전적인 공상 과학 영화에서 수상 경력에 빛나는 Hulu Original 쇼에 이르기까지 공상 과학을 고칠 수있...

당신을위한