Видеофрагменты 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); } } 

Спасибо за любую помощь.

Solutions Collecting From Web of "Видеофрагменты iframe не будут отображаться в полноэкранном режиме в веб-браузере Android"

Вам нужно будет создать пользовательский WebChromeClient, который обрабатывает обе версии onShowCustomView (новая версия этого обратного вызова была введена в уровне API 14), а также наHideCustomView. По сути, что произойдет, так это то, что при попытке воспроизведения полноэкранного просмотра видео вам будет предоставлен вид, который является некоторым вариантом VideoView. Вам нужно прикрепить его к полноэкранному 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 и HTML5 <video>