在没有指南针的设备上获得服务定位

时间:2015-10-13 11:28:02

标签: android

我有一个应用程序接收推送通知,检测当前设备方向(纵向/右侧横向/左侧横向)并拍摄照片。 方向用于设置Camera.Parameters的旋转。

我正在使用SensorManager.getRotationMatrix()来计算方向,但它需要来自地磁传感器的值。 Lenovo S90-A没有指南针,所以似乎我无法获得这些价值观。

我尝试使用此代码:

int rotation = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation();

来自我的Service,但仅在设备开启时才有效。 但是如果设备正在休眠并且我收到推送通知,则此方法始终返回Surface.ROTATION_0

设备将固定在墙上,不应移动。

那么,有没有办法在没有罗盘的情况下检测当前的设备方向?

1 个答案:

答案 0 :(得分:0)

answer非常有帮助。实际上,如果您的设备的方向是平的(例如,它位于桌子上),您不能仅依赖加速度计。 我最终得到了这种方法,我用于没有指南针的设备。 对于带指南针的设备,我使用SensorManager.getRotationMatrix()SensorManager.getOrientation()

    /**
     * calculates rotation only from accelerometer values
     * @param g - accelerometer event values
     * @return
     */
    private int getRotationFromAccelerometerOnly(float[] g) {
        double normOfG = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]);
        // Normalize the accelerometer vector
        g[0] = (float) (g[0] / normOfG);
        g[1] = (float) (g[1] / normOfG);
        g[2] = (float) (g[2] / normOfG);
        int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2])));
        int rotation;
        if (inclination < 25 || inclination > 155) {
            // device is flat, return 0
            rotation = 0;
        } else {
            // device is not flat
            rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1])));
        }

        return rotation;
    }