android - ActivityInfo.SCREEN_ORIENTATION_LOCKED 未锁定方向 - Android

标签 android android-layout android-configchanges

这是 API 18 中的一项功能,我无法真正锁定它。我整晚都在阅读如何手动处理您自己的配置更改,并尝试了很多东西,但我目前的代码无效。

目标:我需要有一个 Activity ,在用户拍摄视频(将他们带回应用程序)之后,着陆页应该是横向或纵向,无论哪种方式用户拿着电话。但是如果他们决定去风景,我想锁定那个位置,这样他们就不能回到肖像(如果他们回去会导致视频观看错误)。所以他们一开始有选择,但如果他们选择那个,就必须留在风景中。但我该怎么做呢?

到目前为止,这是我尝试过的:

  1. 将这个android:configChanges="keyboardHidden|orientation|screenSize"<activity>我在 list 中的 Activity 标签。

  2. 覆盖 onConfigurationChanged()方法:

        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
    
            if (getResources().getConfiguration().orientation ==
                    Configuration.ORIENTATION_LANDSCAPE) {
                setContentView(R.layout.activity_make_photo_video_land);
            } else {
                setContentView(R.layout.activity_make_photo_video);
            }
    
            if (this.getResources().getConfiguration().orientation ==
                    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && Build.VERSION.SDK_INT
                    >= Build.VERSION_CODES.JELLY_BEAN_MR2){
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
            }
        }
    
  3. 我有 2 个 xml 布局,一个用于 layout 文件夹中的肖像,一个用于 layout-land 文件夹中的风景。

我得到的结果是,我可以让布局在方向更改时显示,但我无法将其锁定。我正在使用 KitKat 的设备,所以它应该锁定在那里,但它没有。

我在这里读到的关于锁定方向(或它的变通方法)的每一篇文章似乎都已有 3 或 4 年历史,基本上暗示了我已经在尝试的东西。有任何新信息吗?

谢谢。

最佳答案

你试过这个吗?

public static void lockOrientation(Activity activity) {
        Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int rotation = display.getRotation();
        int currentOrientation = activity.getResources().getConfiguration().orientation;
        int orientation = 0;
        switch(currentOrientation)
        {
        case Configuration.ORIENTATION_LANDSCAPE:
            if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            else
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            break;
        case Configuration.ORIENTATION_PORTRAIT:
            if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            else
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        }
        activity.setRequestedOrientation(orientation);
    }

    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }

关于android - ActivityInfo.SCREEN_ORIENTATION_LOCKED 未锁定方向 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29364621/

相关文章:

android - android中的视频质量?

android - backstack 中的配置更改 fragment 现在共享 FrameLayout 后?

android - 更改 NavigationView 分隔线颜色和子标题文本颜色

android - 在 Fragment 中使用选项卡(不是 FragmentActivity)

java - 如何在点后将 double 转换为 2 数?

java - Android 应用程序在进行另一项 Activity 时强制关闭

android - 状态栏和导航栏颜色不会改变

android - 在 ImageView 旁边的 LinearLayout 中放置两个 textView

android - fragment A 的 findFragmentByTag 为 null,如果 fragment B 上有 setRetain(true)

android - 蜂窝中的方向变化