Android Webview应用程序不会让视频播放器全屏 [英] Android Webview app won't let video player go full screen

查看:205
本文介绍了Android Webview应用程序不会让视频播放器全屏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好我为我的视频网站创建了一个webview应用程序。该网站的设计是为移动用户加载的混合。只有与移动设备兼容的视频才能加载到混合播放器中。玩家来自Vk,日常运动,youtube,quicktime。这些视频只能在sdk 11和更高版本上播放,但是当我点击播放器按钮进入全屏幕时,它只会停止播放视频,而不会启动全屏模式。我正在包括尽可能多的代码,希望有人能帮助我。我已经把这个死了,没有取得任何进展。任何帮助将不胜感激。



(Webviewactivity.java)

  public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow()。requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);

parentView =(RelativeLayout)findViewById(R.id.parent_rl);

webviewProgress =(ProgressBar)findViewById(R.id.webview_progress);

webview =(WebView)findViewById(R.id.webview);
webview.getSettings()。setJavaScriptEnabled(true);
webview.getSettings()。setBuiltInZoomControls(true);
webview.getSettings()。setAllowFileAccess(true);
webview.setWebViewClient(new MyWebViewClient());
webview.getSettings()。setPluginState(WebSettings.PluginState.ON);
webview.loadUrl(URL);
webviewProgress.setProgress(0);

webview.setWebChromeClient(new MyWebChromeClient());
webview.setDownloadListener(new DownloadListener(){
public void onDownloadStart(String url,String userAgent,
String contentDisposition,String mimetype,
long contentLength){
mProgressDialog = new ProgressDialog(WebViewActivity.this);
mProgressDialog.setMessage(下载...);
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog
.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute(url);
}
});

initSlider();

initAdmob();
}

/ **
*选择文件时
* /
@Override
protected void onActivityResult(int requestCode,int resultCode,
意图){
if(requestCode == FILECHOOSER_RESULTCODE){
if(null == mUploadMessage)
return;
Uri result = intent == null || resultCode!= RESULT_OK? null
:intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;

(Main.xml)

  android:id =@ + id / parent_rl
android:layout_width =fill_parent
android:layout_height =fill_parent
android:keepScreenOn =真>

< ProgressBar
android:id =@ + id / webview_progress
style =?android:attr / progressBarStyleHorizo​​ntal
android:layout_width =fill_parent
android:layout_height =wrap_content
android:layout_alignParentTop =true
android:maxHeight =5dip
android:minHeight =5dip
android :progressDrawable =@ drawable / blueprogress/>

< FrameLayout
android:id =@ + id / framelayout
android:layout_width =fill_parent
android:layout_height =wrap_content
android:layout_below =@ id / webview_progress
android:orientation =vertical>

< WebView
xmlns:android =http://schemas.android.com/apk/res/android
android:id =@ + id / webview
android:layout_width =fill_parent
android:layout_height =fill_parent/>

(Manifest.xml)

  package =com.wCHfree
android:versionCode =7
android:versionName =1.1>

< uses-sdk
android:minSdkVersion =11
android:targetSdkVersion =17/>

< uses-permission android:name =android.permission.ACCESS_NETWORK_STATE/>
< uses-permission android:name =android.permission.INTERNET/>

< application
android:icon =@ drawable / ic_launcher_red
android:label =@ string / app_name
android:theme =@ android :style / Theme.Black>
< activity
android:name =com.webview.splashScreen.SplashScreenActivity
android:label =@ string / app_name
android:theme =@ android: style / Theme.NoTitleBar.Fullscreen>
< intent-filter>
< action android:name =android.intent.action.MAIN/>

< category android:name =android.intent.category.LAUNCHER/>
< / intent-filter>
< / activity>
< activity
android:name =com.webview.splashScreen.WebViewActivity
android:configChanges =orientation | screenSize | screenLayout
android:label =@ string / app_name
android:theme =@ android:style / Theme.NoTitleBar.Fullscreen>
< / activity>
< activity
android:name =com.google.ads.AdActivity
android:configChanges =keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | minimizeScreenSize/>


解决方案

您需要实现 showCustomView &您的AndroidManifest文件中还需要 hideCustomView WebChromeClient的方法,您需要 android:hardwareAccelerated =true
我在这里发布我的示例项目。
我做的是在我的main.xml中保存一个Framelayout(customContainer),并在这里添加在showCustomView中接收的视图,并在onHide中删除它。相应地隐藏/显示webview。



AndroidManifest.xml

  ;?xml version =1.0encoding =utf-8?> 
< manifest xmlns:android =http://schemas.android.com/apk/res/android
package =com.example.webview
android:versionCode = 1
android:versionName =1.0>
< uses-sdk android:minSdkVersion =8/>
< uses-permission android:name =android.permission.INTERNET/>
< application android:label =@ string / app_nameandroid:icon =@ drawable / ic_launcher
android:hardwareAccelerated =true>
< activity android:name =MyActivity
android:configChanges =orientation | keyboardHidden
android:hardwareAccelerated =true
android:label =@ string / APP_NAME>
< intent-filter>
< action android:name =android.intent.action.MAIN/>
< category android:name =android.intent.category.LAUNCHER/>
< / intent-filter>
< / activity>
< / application>
< / manifest>

main.xml

 <?xml version =1.0encoding =utf-8?> 
< LinearLayout xmlns:android =http://schemas.android.com/apk/res/android
android:orientation =vertical
android:layout_width =fill_parent
android:layout_height =fill_parent
>
< WebView
android:layout_width =fill_parent
android:layout_height =fill_parent
android:id =@ + id / webView
android: layout_gravity =center
/>
< FrameLayout
android:id =@ + id / customViewContainer
android:layout_width =fill_parent
android:layout_height =fill_parent
android: visibility =gone
/>
< / LinearLayout>

video_progress.xml

 <?xml version =1.0encoding =utf-8?> 
< LinearLayout xmlns:android =http://schemas.android.com/apk/res/android
android:id =@ + id / progress_indicator
android:orientation =vertical
android:layout_centerInParent =true
android:layout_width =fill_parent
android:layout_height =fill_parent>

< ProgressBar android:id =@ android:id / progress
style =?android:attr / progressBarStyleLarge
android:layout_gravity =center
android:layout_width =wrap_content
android:layout_height =wrap_content/>

< TextView android:paddingTop =5dip
android:layout_width =wrap_content
android:layout_height =wrap_content
android:layout_gravity =center
android:text =loading
android:textSize =14sp
android:textColor =?android:attr / textColorPrimary/>
< / LinearLayout>

MyActivity.java

  package com.example.webview; 

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class MyActivity extends Activity {
private WebView webView;
private FrameLayout customViewContainer;
private WebChromeClient.CustomViewCallback customViewCallback;
private查看mCustomView;
private myWebChromeClient mWebChromeClient;
private myWebViewClient mWebViewClient;

/ **
*首次创建活动时调用。
* /
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
customViewContainer =(FrameLayout)findViewById(R.id.customViewContainer);
webView =(WebView)findViewById(R.id.webView);

mWebViewClient = new myWebViewClient();
webView.setWebViewClient(mWebViewClient);

mWebChromeClient = new myWebChromeClient();
webView.setWebChromeClient(mWebChromeClient);
webView.getSettings()。setJavaScriptEnabled(true);
webView.getSettings()。setAppCacheEnabled(true);
webView.getSettings()。setBuiltInZoomControls(true);
webView.getSettings()。setSaveFormData(true);
webView.loadUrl(http://m.youtube.com);
}

public boolean inCustomView(){
return(mCustomView!= null);
}

public void hideCustomView(){
mWebChromeClient.onHideCustomView();
}

@Override
protected void onPause(){
super.onPause(); //更改覆盖方法的主体使用File |设置|文件模板
webView.onPause();
}

@Override
protected void onResume(){
super.onResume(); //更改覆盖方法的主体使用File |设置|文件模板
webView.onResume();
}

@Override
protected void onStop(){
super.onStop(); //更改覆盖方法的主体使用File |设置|文件模板
if(inCustomView()){
hideCustomView();
}
}

@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK){

if(inCustomView()){
hideCustomView();
返回true;
}

if((mCustomView == null)&& webView.canGoBack()){
webView.goBack();
返回true;
}
}
return super.onKeyDown(keyCode,event);
}

class myWebChromeClient扩展WebChromeClient {
私人位图mDefaultVideoPoster;
private查看mVideoProgressView;

@Override
public void onShowCustomView(View view,int requestedOrientation,CustomViewCallback callback){
onShowCustomView(view,callback); //更改覆盖方法的主体使用File |设置|文件模板
}

@Override
public void onShowCustomView(查看视图,CustomViewCallback回调){

//如果视图已存在,则立即终止新的一个
如果(mCustomView!= null){
callback.onCustomViewHidden();
return;
}
mCustomView = view;
webView.setVisibility(View.GONE);
customViewContainer.setVisibility(View.VISIBLE);
customViewContainer.addView(view);
customViewCallback = callback;
}

@Override
public View getVideoLoadingProgressView(){

if(mVideoProgressView == null){
LayoutInflater inflater = LayoutInflater。从(MyActivity.this);
mVideoProgressView = inflater.inflate(R.layout.video_progress,null);
}
return mVideoProgressView;
}

@Override
public void onHideCustomView(){
super.onHideCustomView(); //更改覆盖方法的主体使用File |设置|文件模板
if(mCustomView == null)
return;

webView.setVisibility(View.VISIBLE);
customViewContainer.setVisibility(View.GONE);

//隐藏自定义视图。
mCustomView.setVisibility(View.GONE);

//从其容器中删除自定义视图。
customViewContainer.removeView(mCustomView);
customViewCallback.onCustomViewHidden();

mCustomView = null;
}
}

class myWebViewClient扩展WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url){
return super .shouldOverrideUrlLoading(view,url); //更改覆盖方法的主体使用File |设置|文件模板
}
}

}

您可以从这里克隆示例项目。


Hi I created a webview app for my video site. The design of the site is a hybrid that loads for mobile users. Only videos compatible with mobile devices are loaded onto the hybrid. The players are from Vk, dailymotion, youtube, quicktime. The videos only play on sdk 11 and higher but when I click on the player button to go full screen it only stops the video from playing while never launching into full screen mode. I'm including as much code as I can in hopes someone can help me. I've googled this to death with no progress made. Any help would be greatly appreciated.

(Webviewactivity.java)

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.main);

    parentView = (RelativeLayout) findViewById(R.id.parent_rl);

    webviewProgress = (ProgressBar) findViewById(R.id.webview_progress);

    webview = (WebView) findViewById(R.id.webview);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setBuiltInZoomControls(true);
    webview.getSettings().setAllowFileAccess(true);
    webview.setWebViewClient(new MyWebViewClient());
    webview.getSettings().setPluginState(WebSettings.PluginState.ON);
    webview.loadUrl(URL);
    webviewProgress.setProgress(0);

    webview.setWebChromeClient(new MyWebChromeClient());
    webview.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
            mProgressDialog = new ProgressDialog(WebViewActivity.this);
            mProgressDialog.setMessage("Downloading...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog
                    .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            DownloadFile downloadFile = new DownloadFile();
            downloadFile.execute(url);
        }
    });

    initSlider();

    initAdmob();
}

/**
 * When when file was chosen
 */
@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    if (requestCode == FILECHOOSER_RESULTCODE) {
        if (null == mUploadMessage)
            return;
        Uri result = intent == null || resultCode != RESULT_OK ? null
                : intent.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;

(Main.xml)

android:id="@+id/parent_rl"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:keepScreenOn="true" >

<ProgressBar
    android:id="@+id/webview_progress"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:maxHeight="5dip"
    android:minHeight="5dip"
    android:progressDrawable="@drawable/blueprogress" />

<FrameLayout
    android:id="@+id/framelayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/webview_progress"
    android:orientation="vertical" >

    <WebView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

(Manifest.xml)

package="com.wCHfree"
android:versionCode="7"
android:versionName="1.1" >

<uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher_red"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Black" >
    <activity
        android:name="com.webview.splashScreen.SplashScreenActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.webview.splashScreen.WebViewActivity"
        android:configChanges="orientation|screenSize|screenLayout"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
    </activity>
    <activity
        android:name="com.google.ads.AdActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />

解决方案

You need to implement showCustomView & hideCustomView method of WebChromeClient, also You need android:hardwareAccelerated="true" in your AndroidManifest File. I am posting my sample project here. What i have done is kept one Framelayout(customContainer) in my main.xml, and adding view received in showCustomView here, and removing it in onHide. Also hiding/showing webview accordingly. Below code works perfectly on device.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.webview"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"
            android:hardwareAccelerated="true">
        <activity android:name="MyActivity"
                  android:configChanges="orientation|keyboardHidden"
                  android:hardwareAccelerated="true"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <WebView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/webView"
            android:layout_gravity="center"
            />
    <FrameLayout
            android:id="@+id/customViewContainer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:visibility="gone"
            />
</LinearLayout>

video_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/progress_indicator"
              android:orientation="vertical"
              android:layout_centerInParent="true"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <ProgressBar android:id="@android:id/progress"
                 style="?android:attr/progressBarStyleLarge"
                 android:layout_gravity="center"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>

    <TextView android:paddingTop="5dip"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:text="loading"
              android:textSize="14sp"
              android:textColor="?android:attr/textColorPrimary"/>
</LinearLayout>

MyActivity.java

package com.example.webview;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class MyActivity extends Activity {
    private WebView webView;
    private FrameLayout customViewContainer;
    private WebChromeClient.CustomViewCallback customViewCallback;
    private View mCustomView;
    private myWebChromeClient mWebChromeClient;
    private myWebViewClient mWebViewClient;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
        webView = (WebView) findViewById(R.id.webView);

        mWebViewClient = new myWebViewClient();
        webView.setWebViewClient(mWebViewClient);

        mWebChromeClient = new myWebChromeClient();
        webView.setWebChromeClient(mWebChromeClient);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setSaveFormData(true);
        webView.loadUrl("http://m.youtube.com");
    }

    public boolean inCustomView() {
        return (mCustomView != null);
    }

    public void hideCustomView() {
        mWebChromeClient.onHideCustomView();
    }

    @Override
    protected void onPause() {
        super.onPause();    //To change body of overridden methods use File | Settings | File Templates.
        webView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();    //To change body of overridden methods use File | Settings | File Templates.
        webView.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();    //To change body of overridden methods use File | Settings | File Templates.
        if (inCustomView()) {
            hideCustomView();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            if (inCustomView()) {
                hideCustomView();
                return true;
            }

            if ((mCustomView == null) && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    class myWebChromeClient extends WebChromeClient {
        private Bitmap mDefaultVideoPoster;
        private View mVideoProgressView;

        @Override
        public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
           onShowCustomView(view, callback);    //To change body of overridden methods use File | Settings | File Templates.
        }

        @Override
        public void onShowCustomView(View view,CustomViewCallback callback) {

            // if a view already exists then immediately terminate the new one
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }
            mCustomView = view;
            webView.setVisibility(View.GONE);
            customViewContainer.setVisibility(View.VISIBLE);
            customViewContainer.addView(view);
            customViewCallback = callback;
        }

        @Override
        public View getVideoLoadingProgressView() {

            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(MyActivity.this);
                mVideoProgressView = inflater.inflate(R.layout.video_progress, null);
            }
            return mVideoProgressView;
        }

        @Override
        public void onHideCustomView() {
            super.onHideCustomView();    //To change body of overridden methods use File | Settings | File Templates.
            if (mCustomView == null)
                return;

            webView.setVisibility(View.VISIBLE);
            customViewContainer.setVisibility(View.GONE);

            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);

            // Remove the custom view from its container.
            customViewContainer.removeView(mCustomView);
            customViewCallback.onCustomViewHidden();

            mCustomView = null;
        }
    }

    class myWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);    //To change body of overridden methods use File | Settings | File Templates.
        }
    }

}

You can clone sample project from here..

这篇关于Android Webview应用程序不会让视频播放器全屏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆