Wie man Android-Handy Orientierung matching menschliche Orientierung?

Mache ich eine Karte-app, einschließlich der Position Pfeil, der Ihnen zeigt, welchen Weg Sie konfrontiert sind, etwa so:

Wie man Android-Handy Orientierung matching menschliche Orientierung?

Bekomme ich die Ausrichtung direkt aus SensorManager.getOrientation() mit den ersten Rückgabewert: Azimut. Wenn das Telefon gehalten wird, so dass der Bildschirm zeigt über dem Horizont, und in der Porträt -, der Pfeil funktioniert einwandfrei. Allerdings:

  • Wenn das Telefon gehalten wird, so dass der Bildschirm zeigt unter dem Horizont, der Pfeil um 180 Grad, Weg von der Richtung, die der Benutzer konfrontiert ist.
  • Wenn das Telefon gehalten wird, so dass der Bildschirm gegenüberstellt, ist die Ebene mit dem Horizont, der Pfeil hat keine Ahnung, welchen Weg es zeigt. Azimut nicht wieder sinnvolle Ergebnisse.
  • Wenn das Telefon gekippt wird, Links oder rechts (oder statt im landscape-Modus), der Pfeil kippt nach Links oder rechts.

Den sorgfältig konstruierten und wissenschaftliche Bild unten zeigt, was ich meine (wo blau ist dem Benutzer zugewandt, rot ist der Pfeil-Richtung, der Bildschirm ist ungefähr dem Benutzer zugewandte Gesicht, und Google Maps macht genau das, was ich will):

Wie man Android-Handy Orientierung matching menschliche Orientierung?

(Beachten Sie, dass mit Google Maps, ist es nicht erfolgreich zu tun, die letzten zwei Aktionen auf der Liste, wenn automatisch drehen ausgeschaltet ist. Aber ich bin nicht selbst in dieser Phase noch nicht. Eine Sache zu einer Zeit.)

Scheint es, als ob es einfach mit der Y-Achse nach Richtung wie hier gezeigt: http://developer.android.com/reference/android/hardware/SensorEvent.html, wenn ich will, es zu benutzen, die Umkehrung der Z-Achse nach der Richtung, die meiste Zeit, und das Y, wenn das Telefon flach. Jedoch, angesichts der Werte, die getOrientation() gibt, würde ich schreiben, komplexe Fälle zu lösen einige der Probleme, und die Telefon-facing-Horizont use-case ist nicht lösbar. Ich bin sicher, es ist ein einfacher Weg.

Hier mein code (Wo lastAcceleration und lastMagneticField beide kamen von den internen sensor):

float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
    float[] orientMatrix = new float[3];
    SensorManager.getOrientation(rotationMatrix, orientMatrix);

    orientation = orientMat[0]*180/(float)Math.PI;
}

Was mache ich falsch? Gibt es ein einfacher Weg, dies zu tun?

Edit: Nur um klarzustellen, ich mache die Annahme, dass der Benutzer das Gerät hält vor Ihnen, und der Bildschirm zeigt Ihnen gegenüber. Darüber hinaus, ich kann natürlich nicht sagen, wenn nur einer von Ihnen dreht. Auch bin ich mit der Bewegung des Benutzers, wenn Sie in Bewegung sind, aber dies ist für, wenn Sie stationär.

  • +1 für das wissenschaftliche Bild
  • ist Ihr problem gelöst? Wie hast du lastAcceleration, lastMagneticField?
  • NÖ. Nie gelöst. Vielleicht war es nie lösbar, und es scheint, dass google maps war nicht so smart wie ich dachte, damals. Habe ich schon lange verworfen, es von meiner Liste der Aufgaben, die erledigt werden muss, als ich nicht mehr arbeiten für die gleiche Firma, geschweige denn das gleiche Projekt. Android funktioniert wahrscheinlich ganz anders in diesen Tagen, wie auch immer.
InformationsquelleAutor AlbeyAmakiir | 2012-04-19
Schreibe einen Kommentar