2012-10-23 38 views
15

Şu anda bir web sitesinde dayalı bir Android uygulaması var. iOS uygulaması zaten var ve bazı kodlara tekdüzelik sağlamak zorundayım.iframe videoları, Android web görünümünde tam ekran moduna geçmez

Neredeyse her şey bitti, ancak ilginç bir sorun keşfettim: iframe videosu (Youtube, Dailymotion) içeren bir sayfa için web görünümünü (sayfada görüntülenen herhangi bir kontrolüm yok) kullanırken Oynatıcının düğmesine basmama rağmen tam ekrana git.

Zaten burada bulunan her şeyi denedim, ancak yalnızca hangi sayfaların görüntülenmesini istediğimi bildiğim uygulamalara başvuruyor.

İşte uygulamanın webActivity bölümü için kod: Herhangi bir yardım için

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); 
    } 
} 

teşekkürler.

cevap

2

OnShowCustomView (bu geriçağırımın yeni bir sürümü API 14 düzeyinde tanıtıldı) ve onHideCustomView öğelerinin her ikisini de işleyen özel bir WebChromeClient oluşturmanız gerekecektir. Temelde, tam ekran video oynatmaya çalıştığınızda, VideoView'ın bazı varyasyonları olan bir görünüm verileceğidir. Bunu tam ekran FrameLayout'a eklemeniz ve tüm ekranı kaplamak için düzen hiyerarşinizin köküne yapıştırmanız gerekir. Bittiğinde, tekrar kaldırmanız gerekir. İşte

yüzden takmak yapsın diye aktivite ile sıkıca çift vardı gerçekten tam ekran yapmak için, ben fragmanında yapıyorum videoları

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(); 
    } 
} 

Not oynamak için kullanıyorum bir sürümüdür FrameLayout, yalnızca görünümün değil, tüm görünüm hiyerarşisinin köküdür. WebView and HTML5 <video>

+1

Birkaç ay içinde bu kodu bakmadım: İşte sizin gibi başka bir soru

@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; } 

: Burada

işlevlerdir. Çok sayıda yarı ameliyat ve arta kalan değişkenler. > MattC

+1

Teşekkürler! Kodu biraz değiştirdim, ama kullanabilirdim. – Pascal

İlgili konular