Android Webview应用程序不会让视频播放器全屏 [英] Android Webview app won't let video player go full screen
问题描述
(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 / 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 | 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屋!