android中的屏幕方向检测

android中的屏幕方向检测,android,orientation,Android,Orientation,我正在用android实现一个摄像头。我已将该活动作为景观保留在清单中。 因为我已经给出了固定的方向,所以无法通过显示获得方向。它总是给人以风景的感觉。但我想知道我的设备何时处于纵向或垂直位置。我不想要屏幕方向。有谁能提出一种检测设备方向的好方法吗 感谢大家要检测屏幕方向,您可以在活动中使用以下代码 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurati

我正在用android实现一个摄像头。我已将该活动作为景观保留在清单中。 因为我已经给出了固定的方向,所以无法通过显示获得方向。它总是给人以风景的感觉。但我想知道我的设备何时处于纵向或垂直位置。我不想要屏幕方向。有谁能提出一种检测设备方向的好方法吗


感谢大家

要检测屏幕方向,您可以在活动中使用以下代码

@Override
    public void onConfigurationChanged(Configuration newConfig)
    { super.onConfigurationChanged(newConfig);
    }
谢谢
Deepak

要检测屏幕方向,您可以在活动中使用以下代码

@Override
    public void onConfigurationChanged(Configuration newConfig)
    { super.onConfigurationChanged(newConfig);
    }
谢谢
Deepak

我认为您必须收听加速计传感器的更新,并对其进行分析,以确定方向何时改变。这里有一些听传感器的例子:这里

我想你必须听加速计传感器的更新,并分析它们以确定方向何时改变。这里有一些听传感器的例子:这里我用这个:

@Override
    public void onConfigurationChanged(Configuration _newConfig){
        super.onConfigurationChanged(_newConfig);
        int height = getWindowManager().getDefaultDisplay().getHeight();
        int width = getWindowManager().getDefaultDisplay().getWidth();
        if(width > height){
// landscape
        }else{
// portrait
        }
    }
它是粗糙但有效的。

我用这个:

@Override
    public void onConfigurationChanged(Configuration _newConfig){
        super.onConfigurationChanged(_newConfig);
        int height = getWindowManager().getDefaultDisplay().getHeight();
        int width = getWindowManager().getDefaultDisplay().getWidth();
        if(width > height){
// landscape
        }else{
// portrait
        }
    }
这是一种粗糙但有效的方法。

试试这个: 首先实现SensorEventListener并获取旋转传感器

sensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);
rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
sensorManager.registerListener(this, rotationSensor, SENSOR_INTERVAL);
int FROM_RADS_TO_DEGS = -57;
然后您可以像这样检测设备的角度:

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor == rotationSensor) {
        if (event.values.length > 4) {
            float[] truncatedRotationVector = new float[4];
            System.arraycopy(event.values, 0, truncatedRotationVector, 0, 4);
            updateRotation(truncatedRotationVector);
        } else {
            updateRotation(event.values);
        }
    }
}

private void updateRotation(float[] vectors) {
    float[] rotationMatrix = new float[9];
    SensorManager.getRotationMatrixFromVector(rotationMatrix, vectors);
    int worldAxisX = SensorManager.AXIS_X;
    int worldAxisZ = SensorManager.AXIS_Z;
    float[] adjustedRotationMatrix = new float[9];
    SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisX, worldAxisZ, adjustedRotationMatrix);
    float[] orientation = new float[3];
    SensorManager.getOrientation(adjustedRotationMatrix, orientation);
    float pitch = orientation[1] * FROM_RADS_TO_DEGS;
    if(pitch < -45 && pitch > -135) {
        // if device is laid flat on a surface, we don't want to change the orientation
        return;
    }
    float roll = Math.abs(orientation[2] * FROM_RADS_TO_DEGS);
    if((roll > 45 && roll < 135)) {
        // The device is closer to landscape orientation. Enable fullscreen
        if(!player.isFullScreen()) {
            if(getActivity() != null) {
                player.setFullScreenOn();
            }
        }
    }
    else {
        // The device is closer to portrait orientation. Disable fullscreen
        if(player.isFullScreen()) {
            if(getActivity() != null) {
                player.setFullScreenOff();
            }
        }
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do nothing
}
@覆盖
传感器更改时的公共无效(传感器事件){
if(event.sensor==旋转传感器){
如果(event.values.length>4){
float[]truncatedRotationVector=新浮点[4];
数组复制(event.values,0,truncatedRotationVector,0,4);
updateRotation(截断旋转向量);
}否则{
updateRotation(事件值);
}
}
}
私有void updateRotation(float[]向量){
float[]旋转矩阵=新的float[9];
SensorManager.getRotationMatrixFromVector(旋转矩阵,向量);
int worldAxisX=SensorManager.AXIS_X;
int worldAxisZ=SensorManager.axisz;
浮动[]调整后的旋转矩阵=新浮动[9];
SensorManager.remapCoordination系统(旋转矩阵、worldAxisX、worldAxisZ、调整旋转矩阵);
浮动[]方向=新浮动[3];
SensorManager.getOrientation(调整后的旋转矩阵,方向);
浮动节距=方向[1]*从刻度到刻度;
如果(节距<-45和节距>-135){
//如果设备平放在表面上,我们不想改变方向
返回;
}
浮动辊=数学绝对值(方向[2]*从半径到角度);
如果((滚动>45和滚动<135)){
//设备更接近横向。启用全屏
如果(!player.isFullScreen()){
如果(getActivity()!=null){
player.setFullScreen();
}
}
}
否则{
//设备接近纵向。禁用全屏显示
if(player.isFullScreen()){
如果(getActivity()!=null){
player.setFullScreenOff();
}
}
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//无所事事
}
这是从教程中获得的原始代码,但那是很久以前的事了,所以我不记得教程在哪里。这个版本是严格按照我的要求定制的,但是如果有人从原始版本中认出它,请访问链接

我使用这段代码来检测视频播放器何时应该在我不想允许横向显示的视图页面中全屏显示。除了一件事外,它工作得很好:

它使用RotationSensor硬件,并非所有Android设备都有RotationSensor。如果有人知道如何使用所有设备上都包含的某些硬件(肯定有办法,因为Android知道何时切换方向),请在评论中告诉我,以便我可以更新自己的代码。

尝试以下方法: 首先实现SensorEventListener并获取旋转传感器

sensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);
rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
sensorManager.registerListener(this, rotationSensor, SENSOR_INTERVAL);
int FROM_RADS_TO_DEGS = -57;
然后您可以像这样检测设备的角度:

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor == rotationSensor) {
        if (event.values.length > 4) {
            float[] truncatedRotationVector = new float[4];
            System.arraycopy(event.values, 0, truncatedRotationVector, 0, 4);
            updateRotation(truncatedRotationVector);
        } else {
            updateRotation(event.values);
        }
    }
}

private void updateRotation(float[] vectors) {
    float[] rotationMatrix = new float[9];
    SensorManager.getRotationMatrixFromVector(rotationMatrix, vectors);
    int worldAxisX = SensorManager.AXIS_X;
    int worldAxisZ = SensorManager.AXIS_Z;
    float[] adjustedRotationMatrix = new float[9];
    SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisX, worldAxisZ, adjustedRotationMatrix);
    float[] orientation = new float[3];
    SensorManager.getOrientation(adjustedRotationMatrix, orientation);
    float pitch = orientation[1] * FROM_RADS_TO_DEGS;
    if(pitch < -45 && pitch > -135) {
        // if device is laid flat on a surface, we don't want to change the orientation
        return;
    }
    float roll = Math.abs(orientation[2] * FROM_RADS_TO_DEGS);
    if((roll > 45 && roll < 135)) {
        // The device is closer to landscape orientation. Enable fullscreen
        if(!player.isFullScreen()) {
            if(getActivity() != null) {
                player.setFullScreenOn();
            }
        }
    }
    else {
        // The device is closer to portrait orientation. Disable fullscreen
        if(player.isFullScreen()) {
            if(getActivity() != null) {
                player.setFullScreenOff();
            }
        }
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do nothing
}
@覆盖
传感器更改时的公共无效(传感器事件){
if(event.sensor==旋转传感器){
如果(event.values.length>4){
float[]truncatedRotationVector=新浮点[4];
数组复制(event.values,0,truncatedRotationVector,0,4);
updateRotation(截断旋转向量);
}否则{
updateRotation(事件值);
}
}
}
私有void updateRotation(float[]向量){
float[]旋转矩阵=新的float[9];
SensorManager.getRotationMatrixFromVector(旋转矩阵,向量);
int worldAxisX=SensorManager.AXIS_X;
int worldAxisZ=SensorManager.axisz;
浮动[]调整后的旋转矩阵=新浮动[9];
SensorManager.remapCoordination系统(旋转矩阵、worldAxisX、worldAxisZ、调整旋转矩阵);
浮动[]方向=新浮动[3];
SensorManager.getOrientation(调整后的旋转矩阵,方向);
浮动节距=方向[1]*从刻度到刻度;
如果(节距<-45和节距>-135){
//如果设备平放在表面上,我们不想改变方向
返回;
}
浮动辊=数学绝对值(方向[2]*从半径到角度);
如果((滚动>45和滚动<135)){
//设备更接近横向。启用全屏
如果(!player.isFullScreen()){
如果(getActivity()!=null){
player.setFullScreen();
}
}
}
否则{
//设备接近纵向。禁用全屏显示
if(player.isFullScreen()){
如果(getActivity()!=null){
player.setFullScreenOff();
}
}
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//无所事事
}
这是从教程中获得的原始代码,但那是很久以前的事了,所以我不记得教程在哪里。这个版本是根据我的要求定制的,但是如果有人从原版中认出它,请