我有一个应用程序接收推送通知,检测当前设备方向(纵向/右侧横向/左侧横向)并拍摄照片。
方向用于设置Camera.Parameters
的旋转。
我正在使用SensorManager.getRotationMatrix()
来计算方向,但它需要来自地磁传感器的值。
Lenovo S90-A
没有指南针,所以似乎我无法获得这些价值观。
我尝试使用此代码:
int rotation = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation();
来自我的Service
,但仅在设备开启时才有效。
但是如果设备正在休眠并且我收到推送通知,则此方法始终返回Surface.ROTATION_0
。
设备将固定在墙上,不应移动。
那么,有没有办法在没有罗盘的情况下检测当前的设备方向?
答案 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;
}