【问题标题】:Rotate screen when HTML5 video playing in fullscreen全屏播放 HTML5 视频时旋转屏幕
【发布时间】:2015-04-08 14:40:31
【问题描述】:

首先,我想为我糟糕的英语水平以及我在这篇文章中可能犯的所有错误道歉。 我也是 Android devloppement 中的“初级”(我在空闲时间做这件事),我还不够好,经验还不够 ^^ 很抱歉,如果我可能难以理解你可能给我的答案.

那我在做什么? 我正在创建一个简单的 Android 应用程序。这只是一个加载我的网站的 Webview。 我的网站只是一个随机的 Youtube 视频播放器。

首先我在全屏播放 HTML5 视频时遇到了问题。我通过这个项目成功做到了VideoEnabledWebView

所以我的应用和 VideoEnabledWebView 完全一样。

我的问题是什么? 我在我的应用程序中阻止了屏幕旋转。只有“肖像”模式,我成功地做到了。 但是当我以全屏模式播放视频时,我不能处于横向模式。我明白为什么,但我找不到解决方案,一个能够做到这一点的黑客。 所以我只想在全屏播放视频时才以横向模式旋转屏幕。

首先,这是我的 MainActivity.java :

public class MainActivity extends ActionBarActivity
{
    private VideoEnabledWebView webView;
    private VideoEnabledWebChromeClient webChromeClient;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        webView = (VideoEnabledWebView)findViewById(R.id.webView);

        View nonVideoLayout = findViewById(R.id.nonVideoLayout); // Your own view, read class comments
        ViewGroup videoLayout = (ViewGroup)findViewById(R.id.videoLayout);

        View loadingView = getLayoutInflater().inflate(R.layout.view_loading_video, null); // Your own view, read class comments
        webChromeClient = new VideoEnabledWebChromeClient(nonVideoLayout, videoLayout, loadingView, webView) // See all available constructors...
        {                
            @Override
            public void onProgressChanged(WebView view, int progress)
            {

            }
        };
        webChromeClient.setOnToggledFullscreen(new VideoEnabledWebChromeClient.ToggledFullscreenCallback()
        {
            @Override
            public void toggledFullscreen(boolean fullscreen)
            {
                if (fullscreen)
                {
                    WindowManager.LayoutParams attrs = getWindow().getAttributes();
                    attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
                    attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                    getWindow().setAttributes(attrs);
                    if (android.os.Build.VERSION.SDK_INT >= 14)
                    {
                        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
                    }
                }
                else
                {
                    WindowManager.LayoutParams attrs = getWindow().getAttributes();
                    attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
                    attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                    getWindow().setAttributes(attrs);
                    if (android.os.Build.VERSION.SDK_INT >= 14)
                    {
                        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                    }
                }

            }
        });
        webView.setWebChromeClient(webChromeClient);
        webView.setWebViewClient(new myWebViewClient());

        webView.loadUrl("https://www.awesomekraken.com/fr");
    }

    public class myWebViewClient extends WebViewClient
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public void onBackPressed()
    {
        if (!webChromeClient.onBackPressed())
        {
            if (webView.canGoBack())
            {
                webView.goBack();
            }
            else
            {
                super.onBackPressed();
            }
        }
    }
}

正如你在 onCreate 方法中看到的那样,我把这条线:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

我认为在这部分我可以解决我的问题:

 webChromeClient.setOnToggledFullscreen(new VideoEnabledWebChromeClient.ToggledFullscreenCallback()
        {
            @Override
            public void toggledFullscreen(boolean fullscreen)
            {
                if (fullscreen)
                {
                    WindowManager.LayoutParams attrs = getWindow().getAttributes();
                    attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
                    attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                    getWindow().setAttributes(attrs);
                    if (android.os.Build.VERSION.SDK_INT >= 14)
                    {
                        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
                    }
                }
                else
                {
                    WindowManager.LayoutParams attrs = getWindow().getAttributes();
                    attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
                    attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                    getWindow().setAttributes(attrs);
                    if (android.os.Build.VERSION.SDK_INT >= 14)
                    {
                        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                    }
                }

            }
        });

我尝试将setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 放在 if(fullscreen) 下,但这不起作用。应用在横向切换半秒,webview 重新加载所有页面。

我在 Google 和 StackOverflow 上进行了很多搜索,但从现在开始我没有发现任何有用的东西。

只有这个post和我一样,但他没有得到任何答案。

如果有人有解决方案、提示或建议...

当然,如果我得到更多信息或解决我的问题,我会更新这篇文章。

提前感谢您的帮助!

【问题讨论】:

  • 嘿,你解决过这个问题吗?我也被困在这个问题上。
  • 您好,很抱歉回答迟了...我确实找到了解决方案,但我不记得如何了,我已经没有源代码了。也许你应该试试这个:stackoverflow.com/questions/15768837/…
  • 是的,我最终也弄明白了。我的代码有点疯狂。我最终不得不使用 javascript 和东西。但它有效

标签: android html5-video fullscreen screen-rotation android-fullscreen


【解决方案1】:

我最终旋转了自定义视图容器:

public class RotatedVerticalFrameLayout extends FrameLayout{

    public RotatedVerticalFrameLayout(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    @SuppressWarnings("SuspiciousNameCombination")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(heightMeasureSpec, widthMeasureSpec);
        int w = getWidth();
        int h = getHeight();

        setRotation(90.0f);
        setTranslationX((h - w) / 2);
        setTranslationY((w - h) / 2);

        ViewGroup.LayoutParams lp = getLayoutParams();
        lp.height = w;
        lp.width = h;
        requestLayout();
    }
}

如果您只显示自定义视图而不是操作栏和其他内容,这看起来像横向模式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2022-09-28
  • 2013-10-25
相关资源
最近更新 更多