Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在没有指南针的设备上从服务获取方向_Android - Fatal编程技术网

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