Intereting Posts
Добавление изображения в приложение для ношения Android – начинающий Загрузка файла с Android на .Net Web API с использованием асинхронной клиентской библиотеки Android Android. Выполнение пользовательского списка в настраиваемом диалоговом окне Тост прячется за клавиатурой на BB10 Растровое изображение слишком велико для загрузки в текстуру Использование mockito для проверки функции, использующей контекст Существуют ли шаблоны кода Android для Eclipse? «Ant clean» не очищает мой проект так, как я могу использовать Android Studio – Gradle генерирует определенные файлы javadoc Android 5.0: изменение настроек Обзор экрана Название задачи Цвет фона Как правильно выпустить Android MediaPlayer FileProvider crash – npe пытается вызвать XmlResourceParser на пустую строку Запись MPEG TS с использованием MediaRecorder Фрагмент Заменить не работает, когда отображается список onclick NullPointerException в android.content.ContextWrapper

Android SensorListener Устарела

Я пытаюсь изменить следующий код, чтобы использовать компас, однако у меня возникают проблемы, я пытался использовать SensorEventListener, но мне не удалось. Есть ли какой-нибудь учебник, за которым я могу последовать? Любая помощь будет принята с благодарностью.

private static SensorListener orientationListener; private static boolean isTrackingOrientation = false; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); orientationListener = new SensorListener() { public void onSensorChanged(int s, float v[]) { float northDirection = v[android.hardware.SensorManager.DATA_X]; ((QiblaCompassView)findViewById(R.id.qibla_compass)).setDirections(northDirection, VARIABLE.qiblaDirection); } public void onAccuracyChanged(int s, int a) { } }; } @Override public void onResume() { startTrackingOrientation(); super.onResume(); } @Override public void onPause() { stopTrackingOrientation(); super.onPause(); } private void startTrackingOrientation() { if(!isTrackingOrientation) isTrackingOrientation = ((SensorManager)getSystemService(SENSOR_SERVICE)).registerListener(orientationListener, android.hardware.SensorManager.SENSOR_ORIENTATION); } private void stopTrackingOrientation() { if(isTrackingOrientation) ((SensorManager)getSystemService(SENSOR_SERVICE)).unregisterListener(orientationListener); isTrackingOrientation = false; } 

Это хорошее объяснение того, как работает датчик: http://developer.android.com/reference/android/hardware/SensorEvent.html

Этот код работает успешно:

 package com.example.testvideo; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity implements SensorEventListener { SensorManager mSensorManager; Sensor accSensor; Sensor magnetSensor; float gravity[]; float geoMagnetic[]; float azimut; float pitch; float roll; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); accSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); magnetSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mSensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, magnetSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this, accSensor); mSensorManager.unregisterListener(this, magnetSensor); } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) gravity = event.values.clone(); if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) geoMagnetic = event.values.clone(); if (gravity != null && geoMagnetic != null) { float R[] = new float[9]; float I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, gravity, geoMagnetic); if (success) { float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); azimut = 57.29578F * orientation[0]; pitch = 57.29578F * orientation[1]; roll = 57.29578F * orientation[2]; float dist = Math.abs((float) (1.4f * Math.tan(pitch * Math.PI / 180))); Log.d("log", "orientation values: " + azimut + " / " + pitch + " / " + roll + " dist = " + dist); } } } }