Android 在没有指南针的设备上从服务获取方向
我有一个应用程序,可以接收推送通知,检测当前设备方向(纵向/右侧横向/左侧横向),并拍照。 方向用于设置Android 在没有指南针的设备上从服务获取方向,android,Android,我有一个应用程序,可以接收推送通知,检测当前设备方向(纵向/右侧横向/左侧横向),并拍照。 方向用于设置摄影机的旋转。参数 我正在使用SensorManager.getRotationMatrix()计算方向,但它需要地磁传感器的值。 联想S90-A没有指南针,所以我似乎无法获得这些值 我尝试使用以下代码: int rotation = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotatio
摄影机的旋转。参数
我正在使用SensorManager.getRotationMatrix()计算方向,但它需要地磁传感器的值。
联想S90-A
没有指南针,所以我似乎无法获得这些值
我尝试使用以下代码:
int rotation = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation();
从我的服务
,但它仅在设备打开时工作。
但如果设备处于休眠状态,并且我收到推送通知,则此方法始终返回Surface.ROTATION\u 0
设备将固定在墙上,不得移动
那么,有没有一种不用指南针就能检测当前设备方向的方法?这真的很有帮助。事实上,如果你的设备方向是平的(例如,它躺在桌子上),你不能只依靠加速计。
我最终使用了这个方法,我用它来处理没有指南针的设备。
对于带有指南针的设备,我使用SensorManager.getRotationMatrix()
和SensorManager.getOrientation()
/**
*仅根据加速度计值计算旋转
*@param g-加速计事件值
*@返回
*/
private int GetRotationfrom AccelerometerOnly(浮点[]g){
双范数g=Math.sqrt(g[0]*g[0]+g[1]*g[1]+g[2]*g[2]);
//标准化加速度计矢量
g[0]=(浮动)(g[0]/normOfG);
g[1]=(浮动)(g[1]/normOfG);
g[2]=(浮动)(g[2]/normOfG);
int倾斜度=(int)Math.round(Math.toDegrees(Math.acos(g[2]));
整数旋转;
如果(倾角<25 | |倾角>155){
//设备平坦,返回0
旋转=0;
}否则{
//设备不是扁平的
旋转=(int)Math.round(Math.toDegrees(Math.atan2(g[0],g[1]));
}
返回旋转;
}
设备方向与指南针无关。是加速计为您提供了设备方向。@m0skit0您能给我一个解决方案吗?我真的很努力地想找到它,但没有运气。@m0skit0这没有多大帮助:)我知道如何使用加速度计并收集它的值。问题是如何从这些值获取设备旋转。不过还是要谢谢你。@m0skit0实际上你的评论不是100%正确。如果设备的位置是平的(例如,它躺在桌子上),没有指南针,您无法确定它的旋转方向。
/**
* 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;
}