Поворот экрана при воспроизведении видео HTML5 в полноэкранном режиме

Прежде всего, я хотел бы извиниться за мой плохой уровень английского и за все ошибки, которые я мог сделать в этом посте. Я также «младший» в разработке Android (я делаю это в свободное время), я еще недостаточно хорош и опытен ^^ так что извините, если у меня могут возникнуть трудности с пониманием ответа, который вы можете мне дать .

Так что я делаю? Я создаю простое приложение для 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), но это не работает. Приложение переключается в ландшафт на полсекунды, и веб-просмотр перезагружает всю страницу.

Я много искал в Google и StackOverflow, но с этого момента я не нашел ничего очень полезного.

Только этот пост совпадает с моим, но он не получил никакого ответа.

Если у кого есть решение, подсказка или совет...

Конечно, я обновлю этот пост, если получу дополнительную информацию или решу свою проблему.

Заранее спасибо за помощь !


person Guillaume Ilitch Tchaïkovsky    schedule 08.04.2015    source источник
comment
Эй, ты когда-нибудь решал эту проблему? Я тоже застрял на этом.   -  person lv99Zubat    schedule 03.02.2016
comment
Здравствуйте, извините за поздний ответ ... Я нашел решение, но не помню как, у меня больше нет исходного кода. Возможно, вам стоит попробовать следующее: полноэкранный режим в веб-просмотре Android"> stackoverflow.com/questions/15768837/   -  person Guillaume Ilitch Tchaïkovsky    schedule 17.06.2016
comment
да я тоже в итоге разобрался. хотя мой код немного сумасшедший. в итоге мне пришлось использовать javascript и прочее. но это работает   -  person lv99Zubat    schedule 18.06.2016


Ответы (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();
    }
}

Это похоже на ландшафтный режим, если вы показываете только пользовательский вид вместо панели действий и другого содержимого.

person Sebastian    schedule 27.10.2016
comment
Я считаю этот ответ неполным, но другой ответ: stackoverflow.com/a/43391002/1873877 завершает его. - person Marko; 06.12.2020