检测设备方向

时间:2012-06-28 06:41:00

标签: android automation accelerometer autorotate

我需要检测Android设备方向更改,而无需手动使用传感器数据,同时保持活动方向坚持某种方向

onConfigurationChange无效,因为我的活动会不会轮换。

利用传感器数据来检测方向变化我认为这是一个轮子的发明,因为android已经有嵌入式算法实现来检测设备方向的变化。从另一方面来看,方向变化的检测不是这样的简单检查。

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) {
            return;
        }
        //getResources().getConfiguration().orientation;
        if (event.values[1] < 6.5 && event.values[1] > -6.5) {
            if (orientation!=1) {
                Log.d("Sensor", "Protrait");
            }
            orientation=1;
        } else {
            if (orientation!=0) {
                Log.d("Sensor", "Landscape");
            }
            orientation=0;
        }
   }

确实需要真正的数据处理,例如噪音过滤和突然的短暂摇动/旋转。

那么有什么想法如何使用传统服务检测设备方向? (再一次,我会将我的活动强调到某个方向,因此onConfigurationChange将不起作用)

3 个答案:

答案 0 :(得分:9)

答案 1 :(得分:7)

通过在Manifest中设置screenOrientation属性,您将无法再从onConfigurationChanged获取方向值,因为它会停止触发,因此可以实现{{1}获取SensorEventListenerPitchroll角度来计算方向,但它有点复杂,并且对于这样的任务来说太过分了。我找到的最佳解决方案是使用yaw,以下代码将更新方向更改时的旋转值,根据旋转角度值为0到4:

OrientationEventListener

答案 2 :(得分:5)

我的活动设置为始终处于纵向模式。将此代码放在“创建”上。

    myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) {
        public void onOrientationChanged(int arg0) {
            if (arg0>=315 || arg0<45){
                currentOrientation = Surface.ROTATION_90;
            }else if (arg0>=45 && arg0<135){
                currentOrientation = Surface.ROTATION_180;
            }else if (arg0>=135 && arg0<225){
                currentOrientation = Surface.ROTATION_270;
            }else if (arg0>=225 && arg0<315){
                currentOrientation = Surface.ROTATION_0;
            }
        }
    };