Android: 如何在设备自动旋转屏幕关闭的情况下强制反向纵向?

Android: How to force reverse portrait orientation even if the device auto-rotate screen is off?

我正在开发 app/game,它应该在多人游戏模式下在 portraitreversePortrait 之间切换。 (主要是因为每个玩家都可能在 his/her 回合使用键盘,而设备固定在他们之间的 table。)

我的应用程序在自动旋转开启时运行良好。但是当设备自动旋转关闭时 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()的方法,但效果不佳。我认为它只会在已经改变方向之后被调用,而不是之前!

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

我不知道你到底想达到什么目的。在 OnConfigurationChanged

中调用您的方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
    rotateScreen(true);
    super.onConfigurationChanged(newConfig);
}

但是第一次启动时屏幕是相反的,但是您可以根据需要应用它。

请提供您想要实现的更多详细信息

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

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

<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 and catch 对于防止应用程序在用户未授予或删除权限时崩溃很重要。

然后,在需要时使用如下方式设置方向:

public void rotateScreen(boolean reverse){

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

            }

            else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }
        }
    }

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