Android: Holen Sie sich die Lage des Gerätes aus Azimut -, roll - & Tonhöhe
Ich brauche, um das aktualisierte Gerät Orientierung, aber ich muss fix meine Aktivität auf Hochformat (die habe ich in der layout-xml-Datei), die verhindert, dass mir die aus der Nutzung dieser:
int rotation = getWindowManager().getDefaultDisplay().getRotation();
weil es gibt mir immer den portrait-rotation,
So, ich versuche, verlassen Sie sich auf die sensoren. Ich fand, dass Sensor.TYPE_ORIENTATION
ist veraltet, so dass ich mit einer Kombination von Sensor.TYPE_ACCELEROMETER
& Sensor.TYPE_MAGNETIC_FIELD
und hier ist der event-listener:
SensorEventListener sensorEventListener = new SensorEventListener() {
float[] mGravity;
float[] mGeomagnetic;
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values;
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
if (success) {
float orientationData[] = new float[3];
SensorManager.getOrientation(R, orientationData);
azimuth = orientationData[0];
pitch = orientationData[1];
roll = orientationData[2];
//now how to use previous 3 values to calculate orientation
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//TODO Auto-generated method stub
}
};
Nun Frage ist, wie man die 3 Werte azimuth
, pitch
& roll
zu erkennen, die aktuellen Geräte-Orientierung als eine von diesen:
- Landschaft (rotation 0)
- Portrait (Drehung 90)
- Reverse-Querformat (Drehung-180)
- Reverse Portrait (rotation 270)
Es gibt keine Notwendigkeit für ein magnetisches Feld. Siehe stackoverflow.com/questions/11175599/...
das sieht gut aus, aber in diesem Fall, was wäre die Parameter der
Das Gerät Orientierung ist unabhängig von Azimut, pitch und roll. Wenn Sie nur wollen, um das Gerät zu finden-Orientierung, dann gibt es keine Notwendigkeit zu finden, die rotationsmatrix und somit keine Notwendigkeit zu nennen getRotationMatrix. Ansonsten müssen Sie noch die Berechnung, die ich gepostet.
Aber die Antwort, die du weiter oben geschrieben fehlt etwas "Für den Fall, dass Sie flach, Sie müssen verwenden Sie einen Kompass, um zu sehen, wie viel Sie das Gerät drehen, um von der Startposition."
OK, Sie haben übergeben, in der die Schwerkraft und Magnetfeld für die Parameter in der flach-Fall und verwenden Sie den Azimut zu sehen, wie viel das Gerät drehen von der ursprünglichen position. Aber dies wird Ihnen nicht sagen, die Ausrichtung des Geräts, denn die Ausrichtung ist abhängig davon, wie der Anwender statt der Geräte. Es nur Ihnen sagen, wie viel das Gerät drehen, aus der ursprünglichen position, wo der Anwender statt der Geräte.
das sieht gut aus, aber in diesem Fall, was wäre die Parameter der
getRotationMatrix
?Das Gerät Orientierung ist unabhängig von Azimut, pitch und roll. Wenn Sie nur wollen, um das Gerät zu finden-Orientierung, dann gibt es keine Notwendigkeit zu finden, die rotationsmatrix und somit keine Notwendigkeit zu nennen getRotationMatrix. Ansonsten müssen Sie noch die Berechnung, die ich gepostet.
Aber die Antwort, die du weiter oben geschrieben fehlt etwas "Für den Fall, dass Sie flach, Sie müssen verwenden Sie einen Kompass, um zu sehen, wie viel Sie das Gerät drehen, um von der Startposition."
OK, Sie haben übergeben, in der die Schwerkraft und Magnetfeld für die Parameter in der flach-Fall und verwenden Sie den Azimut zu sehen, wie viel das Gerät drehen von der ursprünglichen position. Aber dies wird Ihnen nicht sagen, die Ausrichtung des Geräts, denn die Ausrichtung ist abhängig davon, wie der Anwender statt der Geräte. Es nur Ihnen sagen, wie viel das Gerät drehen, aus der ursprünglichen position, wo der Anwender statt der Geräte.
InformationsquelleAutor AbdelHady | 2014-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe es gefunden & auch hier ist die Berechnung der Funktion, die aufgerufen wird, innerhalb der Hörer nach dem Lesen der
pitch
&roll
:-- Update --
& hier ist mein voller utility-Klasse Umsetzung
-- Update --
Hinzufügen dieses Bild, um zu helfen visualisieren die
azimuth
,pitch
&roll
:averagePitch
undaverageRoll
im code?sorry für das:) habe ich aktualisiert meine Antwort mit einem link für meine gesamte Implementierung.
Kannst du bitte kurz erklären, hier oder auf das wesentliche die Logik der calculateOrientation Methode, Dank?
Nun, es war vor langer Zeit mit einer Menge von Versuch und Irrtum Methodik :). Aber soweit ich mich erinnere, wenn im portrait (meine apps-Standard-Orientierung), können Benutzer
roll
das Gerät ein wenig nach rechts oder Links, aber wenn Sie rollte Sie zu viel (mehr als 30 Grad), dann müssen wir neu berechnen die neue situation. Sehen Sie dieses Bild für ein besseres Verständnis der roll-und pitch - mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/...InformationsquelleAutor AbdelHady