2012-01-27 20 views
5

में Vimeo वीडियो चलाने मैं निम्नलिखित का उपयोग कर, लोड और खेलने के लिए एक Vimeo वीडियो पाने के लिए प्रबंधित किया है। हालांकि vimeo oembed doc एस में संकेत के अनुसार ऑटोप्ले = 1 लोड पर ऑटो प्ले नहीं करता है। किसी को भी ऑटो खेलने के लिए एक रास्ता मिल गया औरऑटो एंड्रॉयड वेबव्यू

mWebView.getSettings().setJavaScriptEnabled(true); 
mWebView.getSettings().setAppCacheEnabled(true); 
mWebView.getSettings().setDomStorageEnabled(true); 

// how plugin is enabled change in API 8 
if (Build.VERSION.SDK_INT < 8) { 
    mWebView.getSettings().setPluginsEnabled(true); 
} else { 
    mWebView.getSettings().setPluginState(PluginState.ON); 
} 
mWebView.loadUrl("http://player.vimeo.com/video/24577973?player_id=player&autoplay=1&title=0&byline=0&portrait=0&api=1&maxheight=480&maxwidth=800"); 
+0

क्या उपरोक्त कोड ऑटोप्ले के बिना काम कर रहा है ?? – Venkat

+0

हां, मैंने एक वेबव्यू क्लाइंट भी सेट किया है जो एक प्रगति पट्टी को दिखाता/छुपाता है, सुनिश्चित नहीं है कि कोई कस्टम वेब व्यू क्लाइंट प्रभाव स्थापित करता है या नहीं? – scottyab

+0

लेकिन मैंने आपके कोड का उपयोग करके बहुत कोशिश की। लेकिन यह काम नहीं है। इसलिए मैं कस्टम वेबव्यू – Venkat

उत्तर

8

हम एक ही मुद्दे का सामना करना पड़ा है (यह भी जब वीडियो खत्म घटना को पकड़ने के लिए की जरूरत है) ऐसा लगता है कि एंड्रॉयड WebView की (और साथ ही iOS पर होते हैं) को नहीं कर रहे हैं वीडियो की ऑटो-स्टार्ट की अनुमति देने के लिए प्रोग्राम किया गया है क्योंकि यह संभव है कि यह किसी भी डेटा प्लान में खाएगा। जब तक आप Google के WebView को प्रारंभिक बिंदु के रूप में नहीं लेना चाहते हैं और अपना खुद का रोल करना चाहते हैं, तो आपको वास्तव में उस पर टैप करना होगा। यह जितना आसान लगता है उतना आसान नहीं है, हमने कोशिश की!

+0

का उपयोग करता हूं यह लगता है कि वेबव्यू इसे करने के लिए प्रोग्राम नहीं किए गए हैं, क्या आपको एंड्रॉइड वेबव्यू क्लास में विशिष्ट कोड मिला है जो आपको इस निष्कर्ष तक पहुंचाता है? – scottyab

+0

ऐसा नहीं है कि इसे रोकने के लिए कोड है, यह है कि ऐसा करने के लिए कोई कोड नहीं है। – CaseyB

+0

@CaseyB यह उत्तर 2012 से है, क्या यह अभी भी सही है? – khizar

10

यह उत्तर केवल Vimeo लिए विशिष्ट है। लगभग एक दर्जन विफल प्रयासों के बाद, यहां मैं जो काम कर रहा हूं। शायद यह किसी और की मदद करेगा। अन्य एसओ उत्तरों के मूल लेखकों के लिए हजारों माफ़ी। मैंने नीचे कई पैटर्न उधार लिया है - बस सोचा कि यह सब एक ही स्थान पर रखना आसान होगा, और अपने कोड के लिए उनका दावा न करें।

सबसे पहले, मुझे वीमियो प्लेयर को एम्बेड करने के आसपास कोई रास्ता नहीं मिला है (यानी आप सीधे एमपी 4 स्ट्रीम पर नहीं मिल सकते हैं - कम से कम आसानी से या भरोसेमंद नहीं - मुझे यकीन है कि यह जानबूझकर है)। दूसरा, Vimeo अपने प्लेयर को वाद्य यंत्र के लिए एक जावास्क्रिप्ट लाइब्रेरी प्रदान करता है, और इसका उपयोग काफी अपरिहार्य है। सावधान रहें, इसे संदेश पास करने की आवश्यकता है, जो एक नई ब्राउज़र सुविधा है। यह उनके एपीआई पेज पर दस्तावेज है। तीसरा, जैसा कि एसओ पर कहीं और दस्तावेज है, आपको ढेर के हिस्सों को तैयार होने के लिए इंतजार करना और बंदूक कूदने के लिए बहुत सावधान रहना होगा। चौथा, Vimeo प्लेयर में एक विशेष रूप से अनुपयोगी पृष्ठभूमि छवि शामिल है जिसका अर्थ है कि प्लगइन गुम या टूटा हुआ है (फिल्म का एक छोटा फ्रेम, इसके लिए आम आइकन)। वास्तव में इसका मतलब यह है कि आपकी जावास्क्रिप्ट किसी जगह पर बमबारी कर चुकी है, और कुछ भी नहीं चल रहा है। यदि आप एक खाली स्क्रीन पर फिल्म की थोड़ी सी देखते हैं, तो अपनी जावास्क्रिप्ट देखें।

चरण 1. एक WebView सेट करें। आपके पास यह सही है। संदर्भ के लिए, मैंने यहां उपयोग किया है।

mWebView = new WebView((Context) this); 
mWebView.setLayoutParams(new LayoutParams(windowWidth, windowHeight)); 

mWebView.getSettings().setJavaScriptEnabled(true); 
// Watch the sdk level here, < 12 requires 'false 
// Wanted to force HTML5/264/mp4, you may want flash 
// where still available 
mWebView.getSettings().setPluginState(PluginState.OFF); 
mWebView.getSettings().setLoadWithOverviewMode(true); 
mWebView.getSettings().setUseWideViewPort(true); 
mWebView.getSettings().setUserAgentString("Android Mozilla/5.0 AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"); 

wcc = new MyWebChromeClient(); 
mWebView.setWebChromeClient(wcc); 

wvc = new MyWebViewClient(); 
mWebView.setWebViewClient(wvc); 

चरण 2. यदि आप WebView पर काम करना चाहते हैं तो आपको WebChromeClient की आवश्यकता है। यह यहां दस्तावेज है: http://developer.android.com/reference/android/webkit/WebView.html (एचटीएमएल वीडियो समर्थन देखें)।

फिर, संदर्भ यहाँ मैं क्या इस्तेमाल किया है।

private class MyWebChromeClient extends WebChromeClient { 
    @Override 
    public void onProgressChanged(WebView view, int progress) { 
     if(progress == 100) { 
      // Your page is loaded, but not visible, 
      // add whatever navigation elements you plan to use here. 
      // N.B. these are JAVA, not JS nav elements 
     } 
    } 

    @Override 
    public boolean onConsoleMessage(ConsoleMessage cm) { 

    // I like to watch in the console. And, since it was 
    // a very convenient way to monitor the javascript, I 
    // use it for that too. Purists will object, no doubt 

     if(cm.message().equalsIgnoreCase("EVENT -- Finish")) { 
      Log.i(TAG, "---> Finishing . . ."); 
      // Depart the activity 
      finish(); 
     } else { 
      Log.d(TAG, " **Console ["+cm.sourceId()+"] ("+cm.lineNumber()+") ["+cm.message()+"]"); 
     } 
     return(true); 
    } 

     @Override 
     public View getVideoLoadingProgressView() { 
         // Something entertaining while the bytes arrive 
      Log.i(TAG, " -------------> Loading Progress . . . "); 
      LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      return(inflater.inflate(R.layout.loading_video, null)); 
     } 

     @Override 
     public void onShowCustomView(View v, WebChromeClient.CustomViewCallback callback) { 
         // With great sadness, I report that this never fires. 
         // Neither does the 'hide'. 
     } 

     @Override 
     public void onHideCustomView() { 
     } 

} 

WebViewClient इस तरह दिखता है:

private class MyWebViewClient extends WebViewClient { 

    @Override 
    public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      String injection = injectPageMonitor(); 
      if(injection != null) { 
      Log.d(TAG, " ---------------> Page Loaded . . ."); 
       Log.d(TAG, " Injecting . . . ["+injection+"]"); 
       view.loadUrl(injection); 
      } 
    } 

} 

चरण 3. आप खिलाड़ी आग जावास्क्रिप्ट का एक छोटा सा निर्माण करने के लिए की जरूरत है। मैंने इसका इस्तेमाल किया:

public String injectPageMonitor() { 
    return("javascript:" + 
       "jQuery(document).ready(function() { " + 
       "console.log(' === Page Ready ===> Setting up');" + 
       "console.log(' ==== Sending PLAY Command ===');" + 
       "var froogaloop = $f('froog');" + 
       "setTimeout(function() { froogaloop.api('play'); }, 3000);" + 
    "});"); 
} 

त्वरित स्पष्टीकरण। । । मैं अपने जेएस में jQuery का उपयोग करता हूं, जो नीचे आ रहा है। यह केवल सुविधा के लिए है, यदि आप भार को हल्का करना चाहते हैं तो आप सीधे जेएस कर सकते हैं। ध्यान दें कि बाकी सब कुछ तैयार होने के बाद, स्क्रिप्ट वास्तव में आग लगाने के लिए एक और 3 सेकंड इंतजार कर रही है। मेरे कमजोर क्षणों में, मुझे कल्पना है कि वीमियो में तरह के लोगों को "तैयार" कॉलबैक टूटा हुआ है। ऐसा लगता है कि 3 सेकेंड ऐसा करते हैं।

चरण 4. आपको पृष्ठ पर कुछ HTML और जावास्क्रिप्ट की आवश्यकता है। मैंने इसे संसाधनों (कच्चे/vimeo_frame.html) के अंदर एक टेक्स्ट फ़ाइल में रखा है।फ़ाइल इस तरह दिखता है:

<!DOCTYPE html> 
<html> 
<head> 

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> 
<script type="text/javascript">jQuery.noConflict();</script> 
<script src="http://a.vimeocdn.com/js/froogaloop2.min.js"></script> 

<script type="text/javascript"> 

    jQuery(document).ready(function() { 
     var showing_player = false; 
     var froogaloop = $f('froog'); 

      console.log(' === Page Ready ===> Setting up'); 
     jQuery('.froog_container_class').hide(); 
     jQuery('.console').css('height', '100%'); 

     froogaloop.addEvent('ready', function() { 

      console.log('==== PLAYER READY ====> Setting Play Callback'); 
       froogaloop.addEvent('play', function(data) { 
       console.log('EVENT -- Play'); 
       /* No idea why, but if the player isn't displayed, it goes 
        straight to 'pause'. Probably a feature. So I give it 4x4px 
        to do it's thing during setup */ 
       jQuery('.froog_container_class').show(); 
       jQuery('.froog_container_class').css('height', '4px'); 
       jQuery('.froog_container_class').css('width', '4px'); 
       jQuery('.froog_container_class').css('overflow', 'hidden'); 
      }); 

      /* I don't want to reveal the video until it is actually 
       playing. So I do that here */ 
      var showingPlayer = false; 
      froogaloop.addEvent('playProgress', function(data) { 
       if(!showingPlayer && data.percent > 0) { 
        showingPlayer = true; 
        jQuery('.froog_container_class').show(); 
        jQuery('.froog_container_class').css('height', '_windowHeight'); 
        jQuery('.froog_container_class').css('width', '_windowWidth'); 
        /* Most tablets I tested aren't quick enough to make this work 
        but one can still hope */ 
        jQuery('#loading').fadeOut('slow'); 
       } 
      }); 

     }); 
}); 
</script> 
</head> 
<body> 
<style> 
    body { 
    background-image: url('http://<SomethingEntertainingToWatch>.png'); 
    background-size: contain; 
    } 
    .mask { 
    float: left; 
    height: _windowHeight; 
    width: _windowWidth; 
    z-index: 100; 
    background: transparent; 
    display: inline; 
    position: absolute; 
    top: 0; 
    left: 0; 
    } 
    .froog_container_class { 
     position: absolute; 
     height: _windowHeight; 
     width: _windowWidth; 
     left: 0; 
     top: 0; 
     display: inline; 
     z-index: 1; 
    } 
    #froog { 
     display: inline; 
     height: _windowHeight; 
     width: _windowWidth; 
     postion: absolute; 
     top: 0; 
     left: 0; 
    } 
</style> 
<div id="loading" class="loading"><h1>Loading</h1><img class="loading_anim" src="http://foo.bar.com/assets/global/loading.gif"/> 
</div> 
<!-- Completely optional, I put a div in front of the player to block controls --> 
<div id="mask" class="mask"> 
</div> 
<div id="froog_container" class="froog_container_class"> 
    <iframe id="froog" src="_targetUrl?api=1&title=0&byline=0&portrait=0&player_id=froog" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen> 
    </iframe> 
</div> 
</body> 
</html> 

और मैं तो इस तरह html फ़ाइल लोड:

public String genMainHTML() { 
    String code = null; 
    try { 
     Resources res = getResources(); 
     InputStream in_s = res.openRawResource(R.raw.vimeo_frame); 

     byte[] b = new byte[in_s.available()]; 
     in_s.read(b); 
     code = new String(b); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if(code != null) { 
      code = code.replaceAll("_windowHeight", "" + windowHeight + "px"); 
      code = code.replaceAll("_windowWidth", "" + windowWidth + "px"); 
      code = code.replaceAll("_targetUrl", targetUrl); 
      return(code); 
    } else { 
      return(null); 
    } 
} 

और इसलिए है कि यह इंजेक्षन:

mDomain = "http://player.vimeo.com"; 
mWebView.requestFocus(View.FOCUS_DOWN); 
targetUrl = extras.getString("URL"); 
String meat = genMainHTML(); 
mWebView.loadDataWithBaseURL(mDomain, meat, "text/html", "utf-8", null); 

setContentView(mWebView); 

वाह! जब WebView तैयार होता है, तो HTML और जेएस Vimeo प्लेयर के साथ iframe सहित, अंदर जाते हैं। जब दस्तावेज़ लोड होता है, तो हम खिलाड़ी के तैयार होने की प्रतीक्षा करते हैं। जब खिलाड़ी तैयार होता है, तो हम कुछ श्रोताओं को जोड़ते हैं। और 3 सेकंड बाद, हम एपीआई 'प्ले' विधि को आग लगाते हैं।

दर्शकों में सेब-पॉलिशर आश्चर्यजनक हो सकते हैं, पूर्णता के लिए, वीडियो को कैसे रोकता है? दो बिट्स सबसे पहले, जब यह समाप्त होता है, तो मैं इसे प्रदर्शित संदेश के लिए कंसोल आउटपुट देखकर रोकता हूं। इस प्रकार:

public String injectPageFinisher() { 
    return("javascript:" + 
      "jQuery(document).ready(function() { " + 
       "console.log(' === Page Ready ===> Tearing down');" + 
       "console.log(' ==== Sending PAUSE Command ===');" + 
       "var froogaloop = $f('froog');" + 
      "froogaloop.api('pause');" + 
       "jQuery('#froog_container').html('');" + 
      "});"); 
    } 

तो जैसे डाला जा सकता है कौन सा:

@Override 
public void onPause() { 
    super.onPause(); 
    if(isFinishing()){ 
     // Unload the page 
     if(mWebView != null) { 
      Log.i(TAG, " ------> Destroying WebView"); 
      mWebView.destroy(); 
     } 
    } 
    finish(); 
} 

दूसरा सा है जहां वीडियो इसके थोड़ा आत्म पूरा करती है। इस प्रकार, ऊपर vimeo_frame.html में, बस 'चलाएँ' पर कॉलबैक के बाद, मैं डाल:

froogaloop.addEvent('finish', function(data) { 
    console.log('EVENT -- Finish'); 
}); 

और गतिविधि में, मैं इस के लिए देखने के लिए एक सा डाल - onConsoleMessage ओवरराइड में ऊपर देखें।

हाउवर - इस लेखन के अनुसार, मैंने अभी भी एक परेशानी की समस्या को हल नहीं किया है। WebPiew के बाद MediaPlayer रहता है और उसके सभी संतान चले गए हैं। मुझे यकीन है कि इससे कुछ समस्याएं पैदा होती हैं, लेकिन मैंने अभी तक उन्हें पहचान नहीं लिया है।

+1

मैंने देखा है कि तैयार भी नहीं किया जाता है। क्या यह ब्रोकन है या यह सिर्फ एंड्रॉइड की वेबब्यू उउउउहुहहहगगहगह है। –

+0

मुझे पूरा यकीन है कि यह टूटा हुआ है - हालांकि वेबव्यू में निश्चित रूप से इसकी चुनौतियां हैं। Vimeo बस चुपचाप अपने खिलाड़ी reworked (शायद चार हफ्ते पहले?)।यह हमें समायोजित करने के लिए थोड़ा सा ले गया, लेकिन उपर्युक्त समाधान अभी भी काम करता है। –

+0

मुझे Vimeo को काम करने के लिए मिला है (बाहरी प्ले/पॉज़/कमांड कमांड स्वीकार करें) इसके मुकाबले बहुत कम कोड के साथ, मैं कोड को थोड़ा साफ करने के बाद यहां एक और जवाब पोस्ट करूंगा। –

0

मैं एक ही मुद्दा था, मुझे लगता है कि आप इसे ऐसा करने के लिए यह एक इस्तेमाल कर सकते हैं कि:

सार्वजनिक सार शून्य setMediaPlaybackRequiresUserGesture (बूलियन आवश्यकता होती है)

एपीआई स्तर में जोड़ा गया 17 सेट करती है कि वेबव्यू को मीडिया चलाने के लिए उपयोगकर्ता संकेत की आवश्यकता होती है। डिफ़ॉल्ट सच है।

पैरामीटर की आवश्यकता होती है WebView आप कम से कम एक छोटे से मदद करने के लिए मीडिया

आशा खेलने के लिए एक उपयोगकर्ता हावभाव की आवश्यकता है कि क्या!