2012-01-25 22 views
6

WebView'de bir video öğesine sahip bir HTML5 sayfası gösteren bir uygulama var. Videonun nasıl çalışacağını anlamak biraz zamanımı aldı, ancak sonunda Samsung Galaxy Tab üzerinde (Android 3.1) bir Web Görünümünde gömülü olan videoyu oynatmayı başardım.Android'de HTML5 video kaynağı isteğini kapatma WebView

<video controls poster="img/poster.jpg" height="240" width="360"> 
     <source src="video/BigBuck.m4v"> 
     <source src="video/BigBuck.theora.ogv" type="video/ogg"> 
     <source src="video/BigBuck.webm" type="video/webm"> 
     HTML5 video not supported. 
</video> 

video öğesi birden çok kaynak vardır ve şimdi video oynatılmaya başlamadan önce seçilen video kaynağını (ve biçimini) yakalamak için çalışıyorum: Ben video etiketinin aşağıdaki kodu kullanılır. Oynat düğmesini tıkladığımda, video dosyalarının saklandığı web sunucusuna gelen video dosyası için bir HTTP talebi görüyorum, ancak bu isteği uygulama tarafında yakalamayı başaramıyorum.

Video dosyasının isteğinin oradan geçip geçmediğini görmek için birkaç yönteme baktım, ancak bunların hiçbirinden geçmediğini görmedim.

  • shouldOverrideUrlLoading(WebView view, String url) benim WebViewClient benim içinde yalnızca ilk HTML5 sayfası isteği geçer.
  • benim WebViewClient içinde Ben sadece ilk HTML5 sayfa isteği ve video posteri görüntüsü için bir istek iletme görüyorum, ancak video dosyası için değil.
  • onShowCustomView(View view, CustomViewCallback callback), WebChromeClient numaralı telefonumda yalnızca video oynatılırken HTML5 sayfasındaki tam ekran denetimi düğmesini tıklattığımda, ancak yürüt düğmesini tıklattığımda değilken çağrılır. (Bu yöntemin amacı nedir?)

Video dosyası isteğini yakalayabileceğim başka bir yöntem için başka bir yöntem önerisi olan var mı? video elemanı?

+0

Video etiketi için kullandığınız kodu postalayabilir misiniz? Ben çok yakın zamanda bununla uğraştım ve 'shouldOverrideUrlLoading (WebView görünümü, String url)' benim için çalıştı (Gingerbread olsa da). –

cevap

3

Bir javascript yaklaşımı kullanarak sorunu çözdüm. HTML sayfası yüklendiğinde, video meta verileri yüklendiğinde loadedmetadata olayı tetiklenir. O andan itibaren seçilen video kaynağını video öğesinin currentSrc özniteliğinden alabilir ve Android yerel koduna bir JavascriptInterface üzerinden iletebilirsiniz.

HTML5 video öğesinin kodu aşağıdadır. "Android", JavascriptInterface'un javascript'te erişilebildiği addır.

<video poster="image/poster.jpg" height="240" width="360" onloadedmetadata="Android.interceptPlay(this.currentSrc);"> 
    <source src="video/BigBuck.m4v"> 
    <source src="video/BigBuck.webm" type="video/webm"> 
    <source src="video/BigBuck.theora.ogv" type="video/ogg"> 
    HTML5 video not supported. 
</video> 

nihayet JavascriptInterface

private class JavaScriptInterface { 
    Context mContext; 

    /* Instantiate the interface and set the context */ 
    JavaScriptInterface(Context c) { 
     mContext = c; 
    } 

    public void interceptPlay(String source) { 
     // do something 
    } 
} 

Ve kod onloadedmetadata özellik ekleyerek Bu önemli

mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); 

loadedmetadata olayı yakalamak için Etkinlik oluşturma anda WebView'da için JavascriptInterface eklemek HTML5 video öğesine, sayfadaki bir olay dinleyicisini kaydettirerek değil,aracılığıyla yükleme 10 çünkü hızlı bir ağda loadedmetadata olayı dinleyici kaydedilmeden önce tetiklenebilir (bkz. http://dev.opera.com/articles/view/consistent-event-firing-with-html5-video)

+0

Çözümünüz için teşekkürler, Erika; Bu benim de ihtiyacım olan şeye benziyor. – FractalBob

+0

Çok erken konuştum. İlk kez basıldığında Oynat düğmesini durdurmaya ihtiyacım var (videoyu bir kez indiriyorum). Bunu yapmanın kolay bir yolu görüyor musun? – FractalBob

+0

Bunun için bir "* gerçek *" çözüm buldunuz mu? Gerçekten URL'yi engellemem gerekiyor çünkü benim durumumda olay asla tetiklenmeyecek. –