यह उत्तर केवल 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 रहता है और उसके सभी संतान चले गए हैं। मुझे यकीन है कि इससे कुछ समस्याएं पैदा होती हैं, लेकिन मैंने अभी तक उन्हें पहचान नहीं लिया है।
क्या उपरोक्त कोड ऑटोप्ले के बिना काम कर रहा है ?? – Venkat
हां, मैंने एक वेबव्यू क्लाइंट भी सेट किया है जो एक प्रगति पट्टी को दिखाता/छुपाता है, सुनिश्चित नहीं है कि कोई कस्टम वेब व्यू क्लाइंट प्रभाव स्थापित करता है या नहीं? – scottyab
लेकिन मैंने आपके कोड का उपयोग करके बहुत कोशिश की। लेकिन यह काम नहीं है। इसलिए मैं कस्टम वेबव्यू – Venkat