Android Webview应用程序不会让video播放器全屏显示
您好,我为我的video网站创build了一个webview应用程序。 该网站的devise是一个混合加载移动用户。 只有与移动设备兼容的video才能加载到混合动力车上。 玩家来自VK,dailymotion,youtube,quicktime。 video只能播放sdk 11和更高,但是当我点击播放button去全屏,它只停止播放video,而不会启动到全屏模式。 我尽可能地包含尽可能多的代码,希望有人能帮助我。 我已经把这个search引擎无事化了。 任何帮助将不胜感激。
(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" />
您需要实现showCustomView
& hideCustomView
方法,您的AndroidManifest文件中还需要android:hardwareAccelerated="true"
。 我在这里发布我的示例项目。 我所做的是在main.xml中保留一个Framelayout(customContainer),并在showCustomView中添加接收的视图,并在onHide中移除它。 也相应地隐藏/显示webview。 下面的代码在设备上完美工作。
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. } } }
你可以从这里克隆示例项目