iframe视频不会在Android网页视图中进入全屏模式

我正在一个基于网站的 Android应用程序.
iOS应用程序已经存在,我必须尊重一些代码的一致性.

一切都已经完成了,但是我刚刚发现了一个有趣的问题:当使用网页视图(我没有显示页面的任何控件)时,对于具有iframe视频(Youtube,Dailymotion)的页面,它不会全屏即使我按下播放器的按钮.

我已经尝试了很多这里发现的一切,但它只是指应用程序,我知道你需要显示哪些页面.

以下是该应用的webActivity部分的代码

public class WebActivity extends Activity {
    String targetURL = "";
    String title = "";
    WebView wv;

    @Override
    public void onResume() { super.onResume(); CookieSyncManager.getInstance().startSync(); }
    @Override
    public void onPause() { super.onPause();  CookieSyncManager.getInstance().stopSync(); }

    /** Called when the activity is first created. */
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getwindow().requestFeature(Window.FEATURE_PROGRESS);
        //getwindow().requestFeature(Window.FEATURE_NO_TITLE);
        CookieSyncManager.createInstance(getApplicationContext());
        CookieSyncManager.getInstance().startSync();
        CookieManager.getInstance().setAcceptCookie(true);
        /**
         * Todo: WebView Cookie management.
         * Right Now,a cookie is hardcoded here into the WebView instead of getting it from the API called by HttpClient when retrieving the JSON.
         * Need to make things cleaner.
         */
        CookieManager.getInstance().setCookie("http://www.blabla.fr/mobile/","gbapi=1; Domain=.www.blabla.fr"); 
        /**
         * Get parameters
         */
        Bundle b = getIntent().getExtras();
        if(b != null)
        {
            targetURL = b.getString("url");
            title = b.getString("title");
        }

        setTitle(title);
        setContentView(R.layout.activity_webview);

        wv = (WebView) findViewById(R.id.webview);

        WebSettings wvSettings = wv.getSettings();

        // WebView options
        wvSettings.setDefaultTextEncodingName("utf-8");
        wvSettings.setJavaScriptEnabled(true);
        wvSettings.setPluginState(PluginState.ON);
        wvSettings.setJavaScriptCanopenWindowsAutomatically(true);
        wvSettings.setBuiltInZoomControls(true);
        final Activity activity = this;
        wv.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view,int progress) {
                activity.setProgress(progress * 100);
            }
        });

        wv.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView view,int errorCode,String description,String failingUrl) {
                Toast.makeText(activity,"Oh snap! " + description,Toast.LENGTH_SHORT).show();
            }
        });

        wv.loadUrl(targetURL);
    }
}

感谢任何帮助.

解决方法

您将需要创建一个自定义WebChromeClient来处理两个版本的onShowCustomView(这个回调的新版本在API级别14中引入)以及onHideCustomView.基本上会发生什么,当您尝试播放全屏视频时,您将获得视频视频的一些变化.您需要将其附加到全屏FrameLayout,并将其粘贴到布局层次结构的根目录以覆盖整个屏幕.一旦完成,你需要再次删除它.

这是一个我用来播放视频的版本

private class DerpChromeClient extends WebChromeClient implements MediaPlayer.OnCompletionListener,MediaPlayer.OnErrorListener {
    //@Override
    public void onShowCustomView(View view,int requestedOrientation,CustomViewCallback callback) {
        log.warn("onShowCustomView");
        showCustomView(view,callback);
    }

    private View mVideoProgressView;

    @Override
    public void onHideCustomView() {
        super.onHideCustomView();

        activity.removeFullscreenView();
        webView.setVisibility(View.VISIBLE);

        try {
            mCustomViewCallback.onCustomViewHidden();
        } catch (NullPointerException npe) {
            // occasionally Android likes to freak out and throw an unhandled NPE if it can't play the video
            // therefore we are not going to do anything but eat this exception so it fails gracefully
        }

        mCustomView = null;
        mVideoView = null;
    }

    @Override
    public void onShowCustomView(View view,CustomViewCallback callback) {
        super.onShowCustomView(view,callback);
        log.warn("onShowCustomView");
        showCustomView(view,callback);
    }

    private void showCustomView(View view,CustomViewCallback callback) {
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }

        mCustomView = view;
        mCustomViewCallback = callback;
        webView.setVisibility(View.GONE);

        if (view instanceof FrameLayout) {
            if (((FrameLayout)view).getFocusedChild() instanceof VideoView) {
                mVideoView = (VideoView)((FrameLayout)view).getFocusedChild();
            }
        }

        view.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT));
        view.setBackgroundColor(Color.BLACK);
        activity.displayFullscreenView(view);
    }

    @Override
    public boolean onConsoleMessage(ConsoleMessage cm) {
        log.warn("Console Message: " + cm.message() + " on line " + cm.lineNumber() + " of " + cm.sourceId());
        return super.onConsoleMessage(cm);
    }

    @Override
    public void onProgressChanged(WebView view,int newProgress) {
        super.onProgressChanged(view,newProgress);

        if (newProgress < 100) {
            if (loadingProgress.getVisibility() == ProgressBar.GONE) {
                loadingProgress.setVisibility(ProgressBar.VISIBLE);
            }
            loadingProgress.setProgress(newProgress);
        } else if (newProgress >= 100) {
            loadingProgress.setVisibility(ProgressBar.GONE);
        }
    }

    @Override
    public View getVideoLoadingProgressView() {
        if (mVideoProgressView == null) {
            LayoutInflater inflater = LayoutInflater.from(KNowledgeBaseFragment.this.getActivity().getApplicationContext());
            mVideoProgressView = inflater.inflate(R.layout.video_loading_progress,null);
        }

        return mVideoProgressView; 
    }

    @Override
    public boolean onError(MediaPlayer mp,int what,int extra) {
        // Todo Auto-generated method stub
        return false;
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        this.onHideCustomView();
    }
}

请注意,我在片段中进行此操作,因此为了使其真正全屏,我必须将其与活动紧密耦合,以便将FrameLayout附加到整个视图层次结构的根目录,而不仅仅是片段.

以下是这些功能

@Override
public void displayFullscreenView(View customView) {
    parentLayout.addView(customView);
    this.customView = customView;
}

@Override
public void removeFullscreenView() {
    if (customView != null) {
        customView.setVisibility(View.GONE);
        parentLayout.removeView(customView);
    }

    customView = null;
}

这是另一个像你的问题:WebView and HTML5 <video>

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些