android-fragments 如何在Android webview中播放视频启用全屏片段

23c0lvtd  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(205)

这里是我的fragment.java布局代码我有一个视频/图像网站,我想在我的网络视图应用程序中播放视频,但视频不会显示在全屏这里是我的代码,我是非常新的java以及Android请帮助我

package com.ivs.ivsvibe;
 import android.os.Bundle;
 import android.view.LayoutInflater;
import android.view.View;
 import android.view.ViewGroup;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

  import androidx.annotation.NonNull;
  import androidx.annotation.Nullable;
     import androidx.fragment.app.Fragment;

public class Fragment2 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment2,container,false);
    WebView MyWebView = view.findViewById(R.id.webView2);
    MyWebView.loadUrl("https://ivsvibe.com");
    MyWebView.setWebViewClient(new WebViewClient()
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            return false;
        }
    });
    WebSettings webSettings = MyWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    return view;
}
}

这是我的视频定向代码在哪里放置代码的哪一部分请帮助我

private class Browser_Home extends WebViewClient {
    Browser_Home(){}

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }
}

private class ChromeClient extends WebChromeClient {
    private View mCustomView;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    protected FrameLayout mFullscreenContainer;
    private int mOriginalOrientation;
    private int mOriginalSystemUiVisibility;

    ChromeClient() {}

    public Bitmap getDefaultVideoPoster()
    {
        if (mCustomView == null) {
            return null;
        }
        return BitmapFactory.decodeResource(getApplicationContext().getResources(), 2130837573);
    }

    public void onHideCustomView()
    {
        ((FrameLayout)getWindow().getDecorView()).removeView(this.mCustomView);
        this.mCustomView = null;
        getWindow().getDecorView().setSystemUiVisibility(this.mOriginalSystemUiVisibility);
        setRequestedOrientation(this.mOriginalOrientation);
        this.mCustomViewCallback.onCustomViewHidden();
        this.mCustomViewCallback = null;
    }

    public void onShowCustomView(View paramView, WebChromeClient.CustomViewCallback paramCustomViewCallback)
    {
        if (this.mCustomView != null)
        {
            onHideCustomView();
            return;
        }
        this.mCustomView = paramView;
        this.mOriginalSystemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();
        this.mOriginalOrientation = getRequestedOrientation();
        this.mCustomViewCallback = paramCustomViewCallback;
        ((FrameLayout)getWindow().getDecorView()).addView(this.mCustomView, new FrameLayout.LayoutParams(-1, -1));
        getWindow().getDecorView().setSystemUiVisibility(3846 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    }
}
xv8emn3q

xv8emn3q1#

对我有效的解决方案(也可以在片段中实现)。技巧在您的webView的自定义webChromeClient
活动:

class IFrameActivity : PopUpActivity() {

    private lateinit var binding: ActivityIFrameBinding

    private val args by lazy { intent.getSerializableExtra(EXTRA_ARGS) as IFrameActivityArgs }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_i_frame)
    }

    override fun onPostCreate(savedInstanceState: Bundle?) {
        super.onPostCreate(savedInstanceState)

        changeStatusBarIconToLight()

        binding.clRoot.applyEdgeToEdge()

        setupToolbar()

        binding.wvContent.settings?.javaScriptEnabled = true
        binding.wvContent.settings?.javaScriptCanOpenWindowsAutomatically = true
        binding.wvContent.settings?.setSupportMultipleWindows(true)
        binding.wvContent.webViewClient = WebViewClient()
        binding.wvContent.webChromeClient = WebChromeVideoFullScreenClient(this)
        binding.wvContent.loadData(args.data, "text/html; charset=utf-8", "UTF-8")
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        binding.wvContent.restoreState(outState)
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        binding.wvContent.saveState(savedInstanceState)
    }

    private fun setupToolbar() {
        binding.includeAppBar.appBar.setBackgroundColor(appearanceColor)
        binding.includeAppBar.toolbar.setTitle(args.title)
        binding.includeAppBar.toolbar.showArrow()
        binding.includeAppBar.toolbar.setNavigationOnClickListener { finish() }
    }

    companion object {

        private const val EXTRA_ARGS = "IFrameFragment#extra_args"

        fun start(context: Context, args: IFrameActivityArgs) {
            val starter = Intent(context, IFrameActivity::class.java)
            starter.putExtra(EXTRA_ARGS, args)
            context.startActivity(starter)
        }

        fun getIntent(context: Context, args: IFrameActivityArgs) = Intent(context, IFrameActivity::class.java).apply {
            this.putExtra(EXTRA_ARGS, args)
        }

    }

}

活动需要在清单中具有此标志(重要部分是-android:configChanges=“orientation|屏幕大小”

<activity
            android:name=".ui.component.i_frame.IFrameActivity"
            android:configChanges="orientation|screenSize"
            android:screenOrientation="portrait" />

最后是自定义客户端

class WebChromeVideoFullScreenClient(val requireActivity: FragmentActivity) : WebChromeClient() {

    private var customView: View? = null
    private var customViewCallback: CustomViewCallback? = null
    private var originalOrientation = requireActivity.requestedOrientation
    private var originalSystemUiVisibility = requireActivity.window.decorView.systemUiVisibility

    override fun getDefaultVideoPoster(): Bitmap? {
        return if (customView == null) {
            null
        } else BitmapFactory.decodeResource(MicroblinkSDK.getApplicationContext()?.resources, 2130837573)
    }

    override fun onHideCustomView() {
        (requireActivity.window.decorView as FrameLayout).removeView(customView)
        customView = null
        requireActivity.window.decorView.systemUiVisibility = originalSystemUiVisibility
        requireActivity.requestedOrientation = originalOrientation
        customViewCallback!!.onCustomViewHidden()
        customViewCallback = null
        requireActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    }

    override fun onShowCustomView(paramView: View, paramCustomViewCallback: CustomViewCallback) {
        if (customView != null) {
            onHideCustomView()
            return
        }
        customView = paramView
        originalSystemUiVisibility = requireActivity.window.decorView.systemUiVisibility
        originalOrientation = requireActivity.requestedOrientation
        customViewCallback = paramCustomViewCallback
        (requireActivity.window.decorView as FrameLayout).addView(customView, FrameLayout.LayoutParams(-1, -1))
        requireActivity.window.decorView.systemUiVisibility = 3846 or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        requireActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
    }
}

//requireActivity.requestedOrientation =活动信息.*-这一行手动更改屏幕的方向

相关问题