如何在Android中获取方向(如北,西)

时间:2011-11-29 18:37:04

标签: android android-manifest compass-geolocation

我是Android新手,我想根据相机获取方向。如何根据相机获取方向信息?你能给出一个想法吗?

4 个答案:

答案 0 :(得分:8)

不推荐使用TYPE_ORIENTATION

我们不能再使用方向传感器了,我们可以串联使用磁场传感器和加速计传感器来获得相同的功能。它的工作量更大,但它确实允许继续使用回调来处理方向更改。

这是指南针示例http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

加速度计和磁场转换为 azimut

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];

        if (SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic)) {

            // orientation contains azimut, pitch and roll
            float orientation[] = new float[3];
            SensorManager.getOrientation(R, orientation);

            azimut = orientation[0];
        }
    }
}

要指向北方,您可以计算以度为单位的旋转:

float rotation = -azimut * 360 / (2 * 3.14159f);

答案 1 :(得分:1)

根据您的相机不确定您的意思,但您可以根据硬件传感器获得它。请参阅以下链接:

Compass Example

另请查看this页面上的传感器TYPE_ORIENTATION

答案 2 :(得分:1)

这是我到目前为止对我有用的东西,返回的值介于0 - 360之间,但我不认为北方是否经过适当校准?我在运行Android 5.0.1的LG G Pad上使用它

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 outR[] = new float[9];
        float I[] = new float[9];

        boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];

            SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR);

            SensorManager.getOrientation(outR, orientation);
            azimut = orientation[0];

            float degree = (float)(Math.toDegrees(azimut)+360)%360;

            System.out.println("degree " + degree);

我确信有些东西我错过了,但希望这对其他人来说是一个不错的起点。我回顾了很多其他问题,评论等,以达到这一点。

答案 3 :(得分:0)

使用“旋转矢量”传感器,该传感器结合了地磁和重力传感器。然后使用SensorManager.getOrientation将5个值的数组转换为旋转矩阵。如文档所述,第一个值为弧度的罗盘方向。

var positionDegrees = Float.NaN

override fun onSensorChanged(event: SensorEvent?) {
    if (event?.sensor?.type == Sensor.TYPE_ROTATION_VECTOR) {
         val rotationMatrix = FloatArray(9)
         SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector)
         val orientationValues = FloatArray(3)
         positionDegrees = azimuthToDegrees(mValuesOrientation[0])
    }
}

/** Convert such that North=0, East=90, South=180, West=270. */
fun azimuthToDegrees(azimuth: Float): Float {
    return ((Math.toDegrees(azimuth.toDouble())+360) % 360).toFloat()
}