如何使用android在webview中播放视频?

IT技术 javascript android html android-widget android-webview
2021-02-07 10:13:41

我在 sdcard 中加载了一个本地 html,在这个 html 中我使用了标签:

<video id="myvideo" controls width="120" height="60" poster="img/img01.jpg" src="video/01.mp4"></video>

然后我发现我没有加载这个 html,当我禁用标签时:,html 工作正常,我在我的 android avd(2.2) 中测试了这个?

2个回答

首先关心编码。这是一篇文章,其中包含一个工作示例和一些为 Android webkit 编码视频的指南。

然后......当我不得不面对这个问题时,我不得不研究一下并找到了一些有用的答案。基本上你必须像原生浏览器那样打开视频

public class InredisChromeClient extends WebChromeClient implements OnCompletionListener, OnErrorListener {
    private InterfazWebInredis interfazWeb; // Use Your WebView instance instead

    private VideoView mCustomVideoView;

    private LinearLayout mContentView;
    private FrameLayout mCustomViewContainer;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    private LinearLayout mErrorConsoleContainer;
    static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER);

    public InredisChromeClient(InterfazWebInredis iwi) {
        super();
        this.interfazWeb = iwi;
    }

    public void onShowCustomView(View view, CustomViewCallback callback) {
        // super.onShowCustomView(view, callback);
        if (view instanceof FrameLayout) {
            mCustomViewContainer = (FrameLayout) view;
            mCustomViewCallback = callback;
            mContentView = (LinearLayout) interfazWeb.findViewById(R.id.mainContainer);
            if (mCustomViewContainer.getFocusedChild() instanceof VideoView) {
                mCustomVideoView = (VideoView) mCustomViewContainer.getFocusedChild();
                // frame.removeView(video);
                mContentView.setVisibility(View.GONE);
                mCustomViewContainer.setVisibility(View.VISIBLE);
                interfazWeb.setContentView(mCustomViewContainer);
                mCustomVideoView.setOnCompletionListener(this);
                mCustomVideoView.setOnErrorListener(this);
                mCustomVideoView.start();
            }
        }
    }

    public void onHideCustomView() {
        if (mCustomVideoView == null)
            return;
        // Hide the custom view.
        mCustomVideoView.setVisibility(View.GONE);
        // Remove the custom view from its container.
        mCustomViewContainer.removeView(mCustomVideoView);
        mCustomVideoView = null;
        mCustomViewContainer.setVisibility(View.GONE);
        mCustomViewCallback.onCustomViewHidden();
        // Show the content view.
        mContentView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.stop();
        mCustomViewContainer.setVisibility(View.GONE);
        onHideCustomView();
        interfazWeb.setContentView(mContentView);
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        interfazWeb.setContentView(R.layout.main);
        return true;
    }
}

所以,这段代码的灵感来自于浏览器android项目源代码

好吧,这种行为是全屏打开视频。我不知道是否可以在网页内的自己的框架中播放视频。但是这个解决方案对我有用,我也希望你。

问候

你如何在你的 WebView 对象上设置ContentView?我想我错过了一些东西
2021-03-15 10:13:41
@FuegoFingers,该字段interfazWeb是 的一个实例InterfazWebInredis,它扩展了Activity
2021-03-24 10:13:41
我知道这很旧,但我也没有真正得到 setContentView 调用。setContentView 不是 WebView 或其父项的功能。你自己实现了吗?你能提供这个项目的完整源代码吗?我真的很感激。
2021-04-03 10:13:41
我是 android 开发的新手,我想在 android 网页上的本地存储 html(资产文件夹)上播放本地存储的视频。在哪里使用您的代码
2021-04-12 10:13:41
@powerj1984 默认情况下,当您单击视频链接时,WebView 会尝试在新窗口中打开它,因此平台会为您执行此操作。我不知道他们是否改变了这种行为,这就是他们在 FroYo 中的工作方式。
2021-04-13 10:13:41

这应该适用于您已经在使用的 2.x 版本。但是文档说当浏览器全屏时该标签将起作用。

您的 webview 也有可能支持它,但它需要是全屏的。试试这个。(不过这个我没试过)

编辑:要使视图全屏显示,您可以尝试以下操作:

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
谢谢!但是如何使浏览器全屏显示?现在我加载的 html 页面太大了,当我想查看所有页面时,我必须使用滚动条来控制它,以及如何将加载的 htnl 页面自动调整到我的 webview 中并使 webview 全屏?
2021-03-17 10:13:41
有没有人根据这个答案让它工作?它对我不起作用。顺便说一句,我也无法在链接的文档中找到有关全屏的消息。
2021-03-28 10:13:41
它说<video> tag support in fullscreen mode在那里讨论“浏览器”功能
2021-04-05 10:13:41