Android:即使设备自动旋转屏幕关闭,如何强制反向纵向?

时间:2016-04-26 05:46:45

标签: android rotation autorotate portrait auto-rotation

我正在处理应在多人模式下在portraitreversePortrait之间切换的应用/游戏。 (主要是因为当设备固定在它们之间的桌子上时,每个玩家可以在他/她的回合中使用键盘。)

当自动旋转开启时,我的应用程序正常工作..但当设备自动旋转关闭时,reversePortrait方向永远无法实现!

到目前为止我所做的是我在Manifest文件中设置了方向:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|keyboardHidden"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

然后我在运行时通过在需要时调用此方法以编程方式更改方向:

public void rotateScreen(boolean reverse){    
    if (reverse) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
    }
    else{
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

但如果设备自动旋转关闭,那么仍然不会强制reversePortrait方向。

我也尝试了onConfigurationChanged()方法,但它也没有用。我认为只有在改变方向后才会调用它,而不是之前!

我甚至在screenOrientation="reversePortrait"文件中尝试了Manifest,但是当自动旋转关闭时,即使这样也无效。

2 个答案:

答案 0 :(得分:0)

我不知道你想要达到的目标。在OnConfigurationChanged中调用您的方法

@Override
public void onConfigurationChanged(Configuration newConfig) {
    rotateScreen(true);
    super.onConfigurationChanged(newConfig);
}

但是一旦首次启动,屏幕就会反转,但您可以根据自己的要求应用它。

请提供您想要获得的更多详细信息

答案 1 :(得分:0)

经过大量研究后,似乎超越设备锁定方向并将屏幕设置为反向纵向的唯一方法是强制启用设备自动旋转。

首先,必须在标记上方的清单文件中添加此权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />

然后,在mainActivity中定义类似的内容:

public boolean enableAutoRotate(){

        boolean isAutoRotate = android.provider.Settings.System
                .getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 1) == 1;

        if (!isAutoRotate){
            try {
                android.provider.Settings.System
                        .putInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 1);

            } catch (Exception e){
                e.printStackTrace();
            }
        }

        isAutoRotate = android.provider.Settings.System
                .getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 1) == 1;

        return isAutoRotate;
}

如果用户没有提供或删除权限,则try和catch对于防止应用程序崩溃非常重要。

然后,在需要时使用以下内容设置方向:

public void rotateScreen(boolean reverse){

        if (enableAutoRotate()){
            if (reverse) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);

            }

            else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }
        }
    }

如果需要,rotateScreen方法也可以是boolean而不是void。