2010-07-07 38 views
5

Tôi cần lấy lại hướng của điện thoại. Tại thời điểm này tôi đã viết điều này:Android - SensorManager hành vi lạ của 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); 
    ... 

Mã này cho phép tôi định hướng điện thoại nếu tôi để điện thoại trên mặt phẳng và xoay nó trên bề mặt.

Điều tôi không hiểu là tại sao nếu tôi di chuyển điện thoại lên trên giá trị this.actual_orientation[0], là vòng xoay trên trục zed như được mô tả [ở đây] [1], giá trị tăng mặc dù không có xoay vòng.

Có ai đó biết điều gì sẽ xảy ra không?

EDIT

Một điều lạ ..

tôi đã cố gắng ứng dụng của tôi trong văn phòng tại nơi làm việc và nó đã có những hành vi kỳ lạ i được mô tả trước .. tôi đã cố gắng trong cùng một văn phòng (giống tình huống) một ứng dụng la bàn mà tôi lấy từ thị trường và nó có hành vi tương tự của tôi .. khi tôi di chuyển điện thoại trở lên giá trị thay đổi một cách nhất quán .. Tôi đã thử trong cùng một văn phòng (cùng một tình huống) la bàn i-phone và nó không có hành vi kỳ lạ đó!

Sau đó, khi tôi đến ở nhà tôi đã cố gắng cả hai, ứng dụng của tôi và các ứng dụng la bàn của điện thoại Android của tôi, và họ làm việc !! thậm chí nếu tôi di chuyển lên trên điện thoại giá trị ổn định ...

Cảm ơn nhiều.

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

Trả lời

4

Ước tính định hướng thu được bởi các thiết bị phụ thuộc một phần vào sự chỉ đạo từ trường địa phương. Trong các tòa nhà, gần các cấu trúc sắt và gần các thiết bị điện, từ trường được cảm nhận có thể thay đổi đáng kể so với khoảng cách tính bằng feet. Hiệu ứng này có thể dễ dàng nhìn thấy với một bàn tay cầm từ kế hoặc Gauss-mét.

Tôi nghi ngờ rằng những biến dạng này chịu trách nhiệm cho các ứng dụng của bạn về hành vi lạ.

1

Khi bạn nhấc nó lên, bạn giới thiệu một góc quay và điều này ảnh hưởng đến giá trị trả về trong getOrientation. Góc quay đo lượng xoay vòng thiết bị của bạn từ vị trí bình thường, tức là đối với hầu hết thiết bị mà vị trí bình thường có nghĩa là Chân dung thì nếu điện thoại ở hướng ngang, góc quay sẽ là 90 hoặc -90. Vì vậy, nếu bạn muốn đọc đúng, bạn phải gọi remapCoordinateSystem trước cuộc gọi getOrientation.