2010-07-07 9 views
5

Ich muss die Ausrichtung meines Telefons abrufen. Im Moment habe ich dies:Android - SensorManager seltsames Verhalten von getOrientation

public void onSensorChanged(SensorEvent event) { 
    switch (event.sensor.getType()){ 
    case Sensor.TYPE_MAGNETIC_FIELD: 
    this.mag_vals = event.values.clone(); 
    this.sensorReady = true; 
    break; 
    case Sensor.TYPE_ACCELEROMETER: 
    this.acc_vals = event.values.clone(); 
    break; 
    } 
    if (this.mag_vals != null && this.acc_vals != null && this.sensorReady) { 
    this.sensorReady = false; 
    float[] R = new float[ProjectConstants.SIZE_MATRIX]; 
    float[] I = new float[ProjectConstants.SIZE_MATRIX]; 
    SensorManager.getRotationMatrix(R, I, this.acc_vals, this.mag_vals); 

    SensorManager.getOrientation(R, this.actual_orientation); 
    ... 

Dieser Code ermöglicht es mir, um die Ausrichtung des Telefons zu erhalten, wenn ich das Telefon auf eine ebene Fläche verlassen und ich drehen sie über die Oberfläche.

Was ich nicht verstanden habe ist, warum, wenn ich das Telefon nach oben den Wert von this.actual_orientation[0], die Rotation auf der Zed Achse wie beschrieben [hier] [1], der Wert erhöht, obwohl es keine Rotation gab.

Hat jemand wissen was passiert?

EDIT

Eine weitere seltsame Sache ..

ich bei der Arbeit meiner Anwendung im Büro versucht, und es hatte das seltsame Verhalten ich vorher beschrieben .. ich im selben Büro versuchte (gleiche Situation) eine Kompass-App, die ich vom Markt genommen habe und es hat das gleiche Verhalten von mir..wenn ich das Telefon nach oben bewegte, änderte sich der Wert konsequent. Ich versuchte im selben Büro (gleiche Situation) den I-Phone-Kompass und es hatte dieses merkwürdige Verhalten nicht!

Dann, wenn ich zu Hause angekommen habe ich versucht, beide, meine Anwendung und der Kompass-App von meinem Android-Handy, und sie arbeiteten !! selbst wenn ich den Wert stabil ...

Dank nach oben das Telefon bewegen, um eine Menge.

[1]: http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[], float [])

Antwort

4

Die durch die Vorrichtung erhaltenen Orientierungsschätzung hängt von der lokalen Magnetfeldrichtung teilweise. In Gebäuden, in der Nähe von Eisenstrukturen und in der Nähe von elektrischen Geräten kann das gemessene Magnetfeld über Entfernungen, die in Fuß gemessen werden, erheblich variieren. Dieser Effekt kann mit einem Handmagnetometer oder Gauß-Meter leicht gesehen werden.

Ich vermute, dass diese Verzerrungen für Ihre Anwendungen seltsames Verhalten verantwortlich sind.

1

Wenn Sie es anheben, führen Sie einen Rotationswinkel ein und dies wirkt sich auf die Rückgabewerte in getOrientation aus. Der Drehwinkel mißt den Betrag der Drehung Ihres Gerätes aus der normalen Position, d. H. Für die meisten Geräte, bei denen normale Position bedeutet Hochformat, dann, wenn das Telefon in Querformat ist, wäre der Drehwinkel 90 oder -90. Wenn Sie also das korrekte Lesen wünschen, müssen Sie vor dem Aufruf von getOrientation remapCoordinateSystem aufrufen.