Android 获取手机方向,但将屏幕方向固定为纵向

Android 获取手机方向,但将屏幕方向固定为纵向,android,screen-orientation,orientation-changes,Android,Screen Orientation,Orientation Changes,我想得到手机方向,但保持屏幕方向为纵向。 因此,无论用户将手机切换到横向还是纵向,视图都保持不变,但我可以知道它是切换到横向还是纵向 将活动设置为android:screenOrientation=“肖像”将修复这两个问题,但我将无法通过 public void onConfigurationChanged(Configuration newConfig) { switch (newConfig.orientation) { case Configuration.ORIENTAT

我想得到手机方向,但保持屏幕方向为纵向。 因此,无论用户将手机切换到横向还是纵向,视图都保持不变,但我可以知道它是切换到横向还是纵向

将活动设置为android:screenOrientation=“肖像”将修复这两个问题,但我将无法通过

public void onConfigurationChanged(Configuration newConfig) {
    switch (newConfig.orientation) {
    case Configuration.ORIENTATION_PORTRAIT:
        Toast.makeText(this, "Portrait", Toast.LENGTH_SHORT).show();
        break;
    case Configuration.ORIENTATION_LANDSCAPE:
        Toast.makeText(this, "Landscape", Toast.LENGTH_SHORT).show();
        break;
    default:
        break;
    }
}

有人知道如何解决这个问题吗?

进入您想要在该活动的清单文件中设置的内容

android:configChanges="orientation|keyboardHidden"
然后,当用户旋转手机时,OnConfiguration Changed()方法将进入公共空间。 也删除

android:screenOrientation="portrait" 

来自同一活动。

加速计能否满足您的要求?如果是这样的话,也许像这样的(未经测试的)片段会适合您的目的

SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
        sensorManager.registerListener(new SensorEventListener() {
            int orientation=-1;;

            @Override
            public void onSensorChanged(SensorEvent event) {
                if (event.values[1]<6.5 && event.values[1]>-6.5) {
                    if (orientation!=1) {
                        Log.d("Sensor", "Landscape");
                    }
                    orientation=1;
                } else {
                    if (orientation!=0) {
                        Log.d("Sensor", "Portrait");
                    }
                    orientation=0;
                }
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                // TODO Auto-generated method stub

            }
        }, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
SensorManager SensorManager=(SensorManager)this.getSystemService(Context.SENSOR\u SERVICE);
sensorManager.registerListener(新的SensorEventListener(){
int方向=-1;;
@凌驾
传感器更改时的公共无效(传感器事件){
if(事件值[1]-6.5){
如果(方向!=1){
Log.d(“传感器”、“景观”);
}
方向=1;
}否则{
如果(方向!=0){
Log.d(“传感器”、“纵向”);
}
方向=0;
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//TODO自动生成的方法存根
}
},sensorManager.getDefaultSensor(Sensor.TYPE\u加速计),sensorManager.Sensor\u DELAY\u游戏);

如果禁用屏幕方向更改,则显然不会调用OnConfiguration Changed


我认为唯一的方法是使用加速计传感器,请检查。

这里有一个多用途类,用于轻松管理屏幕方向的变化:

public class OrientationManager extends OrientationEventListener {

    public enum ScreenOrientation {
        REVERSED_LANDSCAPE, LANDSCAPE, PORTRAIT, REVERSED_PORTRAIT
    }

    public ScreenOrientation screenOrientation; 
    private OrientationListener listener;

    public OrientationManager(Context context, int rate, OrientationListener listener) {
        super(context, rate);
        setListener(listener);
    }

    public OrientationManager(Context context, int rate) {
        super(context, rate);
    }

    public OrientationManager(Context context) {
        super(context);
    }

    @Override
    public void onOrientationChanged(int orientation) {
        if (orientation == -1){
            return;
        }
        ScreenOrientation newOrientation;
        if (orientation >= 60 && orientation <= 140){
            newOrientation = ScreenOrientation.REVERSED_LANDSCAPE;
        } else if (orientation >= 140 && orientation <= 220) {
            newOrientation = ScreenOrientation.REVERSED_PORTRAIT;
        } else if (orientation >= 220 && orientation <= 300) {
            newOrientation = ScreenOrientation.LANDSCAPE;
        } else {
            newOrientation = ScreenOrientation.PORTRAIT;                    
        }
        if(newOrientation != screenOrientation){
            screenOrientation = newOrientation;
            if(listener != null){
                listener.onOrientationChange(screenOrientation);
            }           
        }
    }

    public void setListener(OrientationListener listener){
        this.listener = listener;
    }

    public ScreenOrientation getScreenOrientation(){
        return screenOrientation;
    }

    public interface OrientationListener {

        public void onOrientationChange(ScreenOrientation screenOrientation);
    }
}

如果任何人都在寻找解决这个问题的Webview/javascript解决方案,下面的代码可以做到这一点

这将触发窗口上的自定义“翻转”事件,并使用jquery中的“额外参数”。它还设置window.flip,类似于window.orientation:

$(window).on('flip',function(ev,angle,orientation) {
    console.log(angle,orientation);
    alert(window.flip);
});

if(window.DeviceOrientationEvent){
jQuery.flip={
调试:错误,
间隔时间:1000,
勾选:假,
贝塔弗拉特:25,
甘玛弗拉特:45,
方向:“纵向主”,
角度:{
“纵向主”:0,
“肖像次要”:0,
「景观小学」:90,
「景观中学」:-90
},
计时器:空,
检查:功能(ev){
如果(!this.checked){
var触发器=false;
if(this.debug)console.log([ev.alpha,ev.beta,ev.gamma]);
如果(ev.beta>this.betaflat){
//如果beta是大的,它的肖像
if(this.debug)console.log('beta-trait-pri');
if(this.orientation!=“纵向主方向”){
这个方向是“纵向主”;
触发器=真;
}
}否则如果(ev.betathis.gammaflat){
//否则,如果伽马是大的,它的景观
if(this.debug)console.log('gamma-landscape-pri');
if(this.orientation!='scape-primary'){
这个方向是“景观-小学”;
触发器=真;
}

}否则,如果(ev.gamma我需要一个解决方案,该解决方案只能按需为我提供方向。这个解决方案对我有效:

public class SensorOrientationChecker {

public final String TAG = getClass().getSimpleName();

int mOrientation = 0;
private SensorEventListener mSensorEventListener;
private SensorManager mSensorManager;

private static SensorOrientationChecker mInstance;

public static SensorOrientationChecker getInstance() {
    if (mInstance == null)
        mInstance = new SensorOrientationChecker();

    return mInstance;
}

private SensorOrientationChecker() {
    mSensorEventListener = new Listener();
    Context applicationContext = GlobalData.getInstance().getContext();
    mSensorManager = (SensorManager) applicationContext.getSystemService(Context.SENSOR_SERVICE);

}

/**
 * Call on activity onResume()
 */
public void onResume() {
    mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}

/**
 * Call on activity onPause()
 */
public void onPause() {
    mSensorManager.unregisterListener(mSensorEventListener);
}

private class Listener implements SensorEventListener {

    @Override
    public void onSensorChanged(SensorEvent event) {
        float x = event.values[0];
        float y = event.values[1];

        if (x<5 && x>-5 && y > 5)
            mOrientation = 0;
        else if (x<-5 && y<5 && y>-5)
            mOrientation = 90;
        else if (x<5 && x>-5 && y<-5)
            mOrientation = 180;
        else if (x>5 && y<5 && y>-5)
            mOrientation = 270;

        //Log.e(TAG,"mOrientation="+mOrientation+"   ["+event.values[0]+","+event.values[1]+","+event.values[2]+"]");
                                                                       }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}

public int getOrientation(){
    return mOrientation;
    }
}
公共类传感器方向检查器{
公共最终字符串标记=getClass().getSimpleName();
内禀赋=0;
私有SensorEventListener mssensoreventlistener;
私人传感器管理器;
专用静态传感器方向检查器;
公共静态SensorOrientationChecker getInstance(){
if(minInstance==null)
MinInstance=新传感器方向检查器();
回报率;
}
私有传感器方向检查器(){
msSensorEventListener=新建侦听器();
Context applicationContext=GlobalData.getInstance().getContext();
MSSensorManager=(SensorManager)applicationContext.getSystemService(Context.SENSOR\u服务);
}
/**
*调用活动onResume()
*/
恢复时公开作废(){
msSensorManager.registerListener(msSensorEventListener、msSensorManager.getDefaultSensor(传感器类型\加速计)、SensorManager.Sensor\延迟\正常);
}
/**
*调用活动onPause()
*/
公共无效暂停(){
mSensorManager.unregisterListener(mSensorEventListener);
}
私有类侦听器实现SensorEventListener{
@凌驾
传感器更改时的公共无效(传感器事件){
float x=事件值[0];
浮动y=事件值[1];
如果(x-5&&y>5)
Morentation=0;

否则,如果(x这比编写一个全新的类要简单得多:

 final OrientationEventListener orientationEventListener = new OrientationEventListener( getApplicationContext() ) {

  @Override
  public void onOrientationChanged( final int orientation ) {
    Log.i("", "orientation = " + orientation );
  }
};

orientationEventListener.enable();

但是如果OnConfiguration更改()被称为方向改变已经执行…我需要之前的信息。嗨,Phillip。这是我自己实现的同一个解决方案。在这种情况下,似乎没有其他选项可以访问传感器以获得设备的方向。如果设备平放在桌子上,这没有多大价值。有人知道k吗现在如何检测反向风景?这会消耗太多电池吗?太好了,非常感谢。难以置信这个答案只获得了一票。这是一个很好的解决方案,但请注意,这只会在以肖像模式为默认模式的智能手机上给出正确的结果。在平板电脑上(以风景为默认模式),在横向方向的情况下,方向的值为0,即必须将270添加到ori
public class SensorOrientationChecker {

public final String TAG = getClass().getSimpleName();

int mOrientation = 0;
private SensorEventListener mSensorEventListener;
private SensorManager mSensorManager;

private static SensorOrientationChecker mInstance;

public static SensorOrientationChecker getInstance() {
    if (mInstance == null)
        mInstance = new SensorOrientationChecker();

    return mInstance;
}

private SensorOrientationChecker() {
    mSensorEventListener = new Listener();
    Context applicationContext = GlobalData.getInstance().getContext();
    mSensorManager = (SensorManager) applicationContext.getSystemService(Context.SENSOR_SERVICE);

}

/**
 * Call on activity onResume()
 */
public void onResume() {
    mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}

/**
 * Call on activity onPause()
 */
public void onPause() {
    mSensorManager.unregisterListener(mSensorEventListener);
}

private class Listener implements SensorEventListener {

    @Override
    public void onSensorChanged(SensorEvent event) {
        float x = event.values[0];
        float y = event.values[1];

        if (x<5 && x>-5 && y > 5)
            mOrientation = 0;
        else if (x<-5 && y<5 && y>-5)
            mOrientation = 90;
        else if (x<5 && x>-5 && y<-5)
            mOrientation = 180;
        else if (x>5 && y<5 && y>-5)
            mOrientation = 270;

        //Log.e(TAG,"mOrientation="+mOrientation+"   ["+event.values[0]+","+event.values[1]+","+event.values[2]+"]");
                                                                       }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}

public int getOrientation(){
    return mOrientation;
    }
}
 final OrientationEventListener orientationEventListener = new OrientationEventListener( getApplicationContext() ) {

  @Override
  public void onOrientationChanged( final int orientation ) {
    Log.i("", "orientation = " + orientation );
  }
};

orientationEventListener.enable();