我正在一个基于网站的
Android应用程序.
iOS应用程序已经存在,我必须尊重一些代码的一致性.
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>