Da SENSOR_ORIENTATION nun veraltet ist, was ist die beste Praxis, um den Kompasskurs zu erhalten? Der alte Weg war so einfach.
Antworten
Zu viele Anzeigen?Das folgende ist ein grundlegendes Beispiel, das den Kompasskurs abruft und in einem TextView anzeigt. Dies erfolgt durch Implementierung des SensorEventListener-Interfaces. Du kannst die Rate ändern, mit der Ereignisse an das System übermittelt werden, indem du die Konstante in der folgenden Codezeile änderst (z.B. "mSensorManager.registerListener(this, mCompass, SensorManager.SENSOR_DELAY_NORMAL);") (siehe das OnResume-Ereignis); jedoch ist die Einstellung nur ein Vorschlag an das System. Dieses Beispiel verwendet auch die onReuse() und onPause()-Methoden, um den Batterieverbrauch zu reduzieren, indem der Hörer registriert und abgemeldet wird, wenn er nicht verwendet wird. Hoffentlich hilft dies.
package edu.uw.android.thorm.wayfinder;
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.widget.TextView;
public class CSensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mCompass;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layoutsensor);
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mCompass = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
mTextView = (TextView) findViewById(R.id.tvSensor);
}
// Die folgende Methode wird vom SensorEventListener-Interface benötigt;
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// Die folgende Methode wird vom SensorEventListener-Interface benötigt;
// Verknüpfe dieses Ereignis, um Aktualisierungen zu verarbeiten;
public void onSensorChanged(SensorEvent event) {
float azimuth = Math.round(event.values[0]);
// Die anderen bereitgestellten Werte sind:
// float pitch = event.values[1];
// float roll = event.values[2];
mTextView.setText("Azimut: " + Float.toString(azimuth));
}
@Override
protected void onPause() {
// Melden den Hörer im onPause-Ereignis ab, um den Batterieverbrauch zu reduzieren;
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mCompass, SensorManager.SENSOR_DELAY_NORMAL);
}
}
Das folgende ist die zugehörige XML-Datei:
SensorManager.getOrientation(float[] R, float[] values) ist der Standard-API-Aufruf, der seit API-Level 3 verwendet werden sollte.