콘텐츠
- 어떤 Android 센서를 사용할 수 있습니까?
- 환경 센서 : 주변 광 측정
- 센서 데이터 표시
- 센서와 통신 : SensorManager, SensorEvents 및 리스너
- 1. SensorManager 인스턴스 확보
- 2. lightTextView에 대한 참조를 얻습니다.
- 3. 센서가 현재 장치에 존재하는지 확인
- 4. 센서 리스너 등록
- 5. SensorEventListener 콜백 구현
- onSensorChanged ()
- onAccuracyChanged ()
- 6. 센서 값을 검색
- 7. 청취자 등록 해제
- Android의 광 센서 사용 : 완성 된 코드
- 완성 된 Android 센서 앱 테스트
- Android의 근접 센서로 거리 측정
- 사용자 인터페이스 만들기
- 근접 센서에서 데이터 가져 오기
- 테스트 : 사용자가 기기와 얼마나 가깝습니까?
- 모션 센서 : 다차원 어레이 처리
- 실시간 피치 및 롤 데이터 표시
- 앱에서 회전 벡터 센서 사용
- 1. TYPE_ROTATION_VECTOR를 사용하십시오.
- 2. 센서 데이터 번역
- 3. 자리 표시 자 문자열 업데이트
- 여러 센서 데이터 표시 : 완성 된 코드
- 최종 Android 센서 애플리케이션 테스트
- 마무리
오늘날 대부분의 최신 Android 기기에는 많은 센서가 장착되어 있습니다.
이 정보는 여러 가지 방식으로 사용할 수 있습니다. 응용 프로그램에서 밝기 나 색상 구성표를 자동으로 조정할 수 있도록 조명 수준을 모니터링하는지 여부입니다. 사용자가 장치를 기울이는 것과 같은 제스처를 사용하여 모바일 게임과 상호 작용할 수 있도록합니다. 또는 근접 센서를 사용하여 사용자가 장치를 귀에 대고있을 때마다 터치 이벤트를 자동으로 비활성화합니다.
이 기사에서는 다양한 하드웨어 및 소프트웨어 센서에서 빛, 근접성 및 모션 데이터를 검색하는 세 가지 애플리케이션을 작성합니다. 또한 이러한 Android 센서를 실시간으로 모니터링하므로 응용 프로그램은 항상 최신 정보에 액세스 할 수 있습니다.
이 기사의 끝 부분에서는 Android 센서에서 단일 데이터를 추출하는 방법과 데이터를 다차원 배열 형태로 제공하는 센서를 처리하는 방법에 대해 알아 봅니다.
어떤 Android 센서를 사용할 수 있습니까?
안드로이드 센서는 다음과 같은 범주로 나눌 수 있습니다.
- 환경 센서. 대기 온도, 압력, 습도 및 주변 조명 수준과 같은 환경 조건을 측정합니다.
- 위치 센서. 이 범주에는 근접 센서 및 지 자기장 센서와 같이 장치의 물리적 위치를 측정하는 센서가 포함됩니다.
모션 센서. 이 센서는 장치 동작을 측정하며 가속도계, 중력 센서, 자이로 스코프 및 회전 벡터 센서를 포함합니다.
또한 센서는 다음 중 하나 일 수 있습니다.
- 하드웨어 기반. 이들은 장치에 내장되어 있으며 주변 지 자기장의 가속 또는 강도와 같은 특정 속성을 직접 측정하는 물리적 구성 요소입니다.
- 가상 센서 또는 복합 센서라고도하는 소프트웨어 기반. 이들은 일반적으로 여러 하드웨어 기반 센서에서 데이터를 수집합니다. 이 기사의 끝 부분에서 장치의 가속도계, 자력계 및 자이로 스코프의 데이터를 결합하는 소프트웨어 센서 인 회전 벡터 센서를 사용할 것입니다.
환경 센서 : 주변 광 측정
Android의 광 센서는 사람의 눈으로 감지되는 빛의 강도 인“럭스”단위로 주변 광을 측정합니다. 센서가보고하는 럭스 값은 장치마다 다를 수 있으므로 응용 프로그램에 일관된 값이 필요한 경우 응용 프로그램에서 원시 데이터를 사용하기 전에 조작해야합니다.
이 섹션에서는 장치의 조도 센서에서 현재 럭스 값을 검색하여 TextView에 표시 한 다음 새 데이터를 사용할 수있게되면 TextView를 업데이트하는 응용 프로그램을 작성합니다.그런 다음이 정보를 다양한 앱에서 사용할 수 있습니다. 예를 들어, 라이트 센서에서 정보를 가져 와서 현재 라이트 레벨에 따라 빔의 강도를 자동으로 조정하는 토치 애플리케이션을 만들 수 있습니다.
원하는 설정으로 새 Android 프로젝트를 만들고 시작하겠습니다.
센서 데이터 표시
이제 조명 센서에서 추출한 데이터를 표시하는 TextView를 추가하겠습니다. 이 TextView는 새 데이터를 사용할 수있게 될 때마다 업데이트되므로 사용자는 항상 최신 정보에 액세스 할 수 있습니다.
프로젝트의 activity_main.xml 파일을 열고 다음을 추가하십시오.
다음으로 레이아웃에서 참조되는 "light_sensor"문자열 리소스를 만들어야합니다. 프로젝트의 strings.xml 파일을 열고 다음을 추가하십시오.
“% 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”문자열을 작성하십시오. 다시이 문자열은 자리 표시자를 포함해야하며,이 결과는 근접 센서에서 추출 된 데이터로 채워집니다.
근접 센서에서 데이터 가져 오기
광 센서와 유사하게 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. 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 앱을 본 적이 있습니까? 아래 의견에 알려주십시오!