2013-03-01 22 views
8

tôi đang cố gắng để có được mang la bàn ở độ (tức là 0-360) sử dụng các phương pháp sau đây:Android Compass Mang

float[] mGravity; 
float[] mGeomagnetic; 
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 orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      float azimut = orientation[0]; 
      bearing.setText("Bearing: "+ azimut); 
     } 
    } 
} 

Giá trị góc phương vị (tức là orientation[0]) phải là 0 < = góc phương vị < 360 nhưng Tôi chỉ nhận được giá trị từ -3 đến 3 khi tôi xoay thiết bị của mình. Ai đó có thể vui lòng cho tôi biết vấn đề có thể là gì không?

Trả lời

10

Các giá trị trong radian, bạn phải chuyển đổi sang mức độ arc

int azimut = (int) Math.round(Math.toDegrees(orientation[0])); 
+0

Thank you very much @Hoan Nguyễn – user1135357

+0

hướng [0] dường như chỉ cung cấp sự khác biệt kể từ lần đọc cuối cùng. Tôi đã chuyển đổi giá trị của tôi thành độ nhưng giá trị vẫn còn rất nhỏ. Có cách nào để có được vòng bi thực sự của thiết bị (0 - 360 độ) trong một lần đọc không? –

+0

Nó không phải là một sự khác biệt, nó là mang thực tế đối với phía bắc từ tính. Có gì đó sai với mã của bạn nếu đọc của bạn luôn là một giá trị nhỏ. –

4

Đúng là nó đang ở trong radian. Cảm ơn Hoan. Tôi thêm một số logic để có được điều đó mang trong độ 0-360 bởi vì nếu tôi chỉ chuyển đổi nó để độ, tôi đã nhận được các giá trị từ -180 đến 180.

float azimuthInRadians = orientation[0]; 
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians)+360)%360; 
0
This answer applies to Google Maps api v2. 
It is possible by registering your application with Sensor Listener for Orientation and get the 
angle relative to true north inside onSensorChanged and update camera accordingly. 
Angle can be used for bearing. Following code can be used: 

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION 
has been deprecated. 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if (sensorManager != null) 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_GAME); 
} 

public void onSensorChanged(SensorEvent event) { 

    float compassBearingRelativeToTrueNorth = Math.round(event.values[0]); 

    Log.d(TAG, "Degree ---------- " + degree); 

    updateCamera(compassBearingRelativeToTrueNorth); 

} 

private void updateCamera(float bearing) { 
    CameraPosition oldPos = googleMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) 
      .build(); 

    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 

}