2013-06-12 15 views
25

Używam WebView do wyświetlania osadzonego wideo z Youtube i działa na Galaxcy S2 (OS 2.3.5), a nie na Nexus S (OS 2.3.4), wszystko co dostaję jest biały ekran bez wyświetlania wideo.Osadzanie wideo z YouTube w aplikacji na Androida

Oto fragment kodu używam i deklaracje w pliku manifestu:

private WebView wv; 

private void setWebView() 
{ 
wv = (WebView) findViewById(R.id.webView); 

wv.setWebChromeClient(new WebChromeClient()); 

wv.getSettings().setPluginState(WebSettings.PluginState.ON); 

wv.setWebViewClient(new WebViewClient()); 

wv.getSettings(); 

wv.setBackgroundColor(0x00000000); 

wv.setKeepScreenOn(true); 

wv.setHorizontalScrollBarEnabled(false); 
wv.setVerticalScrollBarEnabled(false); 

wv.getSettings().setBuiltInZoomControls(true); 

final String mimeType = "text/html"; 
final String encoding = "UTF-8"; 
String html = getHTML(); 

wv.loadDataWithBaseURL("", html, mimeType, encoding, ""); 

} 


public String getHTML() 
{ 

String html = "<html>" 

    + "<head>" 
+ "</head>" 
+ "<body style=\"border: 0; padding: 0\">" 
+ "<iframe " 
+ "type=\"text/html\" " 
+ "class=\"youtube-player\" " 
+ "width= 100%\"" 
+ "\" " 
+ "height= 95%\"" 
+ "\" " 
+ "src=\"http://www.youtube.com/v/" 
+ selected_video 
    + "?controls=0&showinfo=0&showsearch=0&modestbranding=0" + 
"&autoplay=1&fs=1&vq=hd720\" " + "frameborder=\"0\"></iframe>" 
    + "</body>" 
    + "</html>"; 

return html; 
} 

Uwaga: parametr „selected_video” to skrót wideo (videoID).

Deklaracje w pliku manifestu:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android=http://schemas.android.com/apk/res/android 
. 
. 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

<application 
    . 
    . 
    android:hardwareAccelerated="true" > 

    . 
    . 

proszę dać mi znać w przypadku uznając coś powinienem zmienić w moim kodu, lub pomóc w pełnym kodem, który może obsługiwać wszystkie urządzenia z Androidem i OS do wyświetlania osadzonych (In-App) Youtube wideo o wysokiej jakości.

AKTUALIZACJA: Zwróć uwagę, rozwiązanie, którego szukam, powinno wyświetlać wideo w wysokiej rozdzielczości. Zrobiłem to na różnych urządzeniach i systemie operacyjnym, używając klasy VideoView, ale jakość wideo nie jest wystarczająco dobra. Każde rozwiązanie, w tym VideoView lub WebView lub w jakikolwiek inny sposób, zostanie zaakceptowane tylko wtedy, gdy będzie wyświetlać filmy wideo w wysokiej jakości. Podziękowania dla wszystkich respondentów!

+0

Nie jestem pewien, ale to może być prob flash Flash jest zainstalowany w Nexus S ??? http://stackoverflow.com/questions/5791035/what-does-install-flash-plugin-in-webview-mean – idan

+0

Mogę używać innych aplikacji, które robią to samo na moim Nexusie S. Nie chcę, żeby flash był musi używać aplikacji ... – Idan

+0

Mam na myśli, że to nie działa, ponieważ Youtube wymaga Flasha, sprawdź, czy urządzenia mogą przeglądać serwis YouTube i oglądać filmy? i Daj mi znać wynik (nie wypróbuj aplikacji YouTube tylko na stronie youtube) maby ather use app, youtube android player? https://developers.google.com/youtube/android/player/ – idan

Odpowiedz

2

To działa tak:

String item = "http://www.youtube.com/embed/"; 

String ss = "your url"; 
ss = ss.substring(ss.indexOf("v=") + 2); 
item += ss; 
DisplayMetrics metrics = getResources().getDisplayMetrics(); 
int w1 = (int) (metrics.widthPixels/metrics.density), h1 = w1 * 3/5; 
wv.getSettings().setJavaScriptEnabled(true); 
wv.setWebChromeClient(chromeClient); 
wv.getSettings().setPluginsEnabled(true); 

try { 
    wv.loadData(
    "<html><body><iframe class=\"youtube-player\" type=\"text/html5\" width=\"" 
    + (w1 - 20) 
    + "\" height=\"" 
    + h1 
    + "\" src=\"" 
    + item 
    + "\" frameborder=\"0\"\"allowfullscreen\"></iframe></body></html>", 
          "text/html5", "utf-8"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

private WebChromeClient chromeClient = new WebChromeClient() { 

    @Override 
    public void onShowCustomView(View view, CustomViewCallback callback) { 
     super.onShowCustomView(view, callback); 
     if (view instanceof FrameLayout) { 
      FrameLayout frame = (FrameLayout) view; 
      if (frame.getFocusedChild() instanceof VideoView) { 
       VideoView video = (VideoView) frame.getFocusedChild(); 
       frame.removeView(video); 
       video.start(); 
      } 
     } 

    } 
}; 
+0

Ten kod się nie kompiluje (dane powinny być metrykami). Co dokładnie powinno znajdować się w "twoim adresie URL"? czy możesz podać lepszy przykład? – Idan

33

jest oficjalnym YouTube Android Player API wich można użyć. Jest to nieco bardziej skomplikowane, ale działa lepiej niż inne rozwiązania korzystające z webmasterów.

Najpierw musisz zarejestrować swoją aplikację w Googles API Console. Jest to całkowicie bezpłatne, dopóki aplikacja nie otrzyma ponad 25 tys. Żądań na miesiąc (lub coś w tym stylu). Pod linkiem znajdują się doskonałe samouczki. Mam nadzieję, że je zrozumiesz. Jeśli nie, zapytaj! :)

+0

Dzięki! Jak głupio ode mnie nie mogłem znaleźć API dla youtube. Lol –

+2

YouTube player api wymagają zainstalowanej aplikacji youtube i usługi Google Play, ale Osadź wideo z Youtube do uruchomienia na każdym urządzeniu – vuhung3990

4

chociaż proponuję użyć youtube api lub zadzwonić do nowych intencji i sprawić, że system sobie z tym poradzi (np. Aplikacja youtube), tutaj jest jakiś kod, który może ci pomóc, ma połączenie z ukrytą metodą, ponieważ nie możesz wstrzymać i wznowić wyświetlanie WWW

import java.lang.reflect.Method; 

import android.annotation.SuppressLint; 
import android.os.Bundle; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 

import android.app.Activity; 

@SuppressLint("SetJavaScriptEnabled") 
public class MultimediaPlayer extends Activity 
{ 
    private WebView mWebView; 
    private boolean mIsPaused = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.webview); 

     String media_url = VIDEO_URL; 

     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.setWebChromeClient(new WebChromeClient()); 

     WebSettings ws = mWebView.getSettings(); 
     ws.setBuiltInZoomControls(true); 
     ws.setJavaScriptEnabled(true); 

     mIsPaused = true; 
     resumeBrowser(); 
     mWebView.loadUrl(media_url); 
    } 

    @Override 
    protected void onPause() 
    { 
     pauseBrowser(); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() 
    { 
     resumeBrowser(); 
     super.onResume(); 
    } 

    private void pauseBrowser() 
    { 
     if (!mIsPaused) 
     { 
      // pause flash and javascript etc 
      callHiddenWebViewMethod(mWebView, "onPause"); 
      mWebView.pauseTimers(); 
      mIsPaused = true; 
     } 
    } 

    private void resumeBrowser() 
    { 
     if (mIsPaused) 
     { 
      // resume flash and javascript etc 
      callHiddenWebViewMethod(mWebView, "onResume"); 
      mWebView.resumeTimers(); 
      mIsPaused = false; 
     } 
    } 

    private void callHiddenWebViewMethod(final WebView wv, final String name) 
    { 
     try 
     { 
      final Method method = WebView.class.getMethod(name); 
      method.invoke(mWebView); 
     } catch (final Exception e) 
     {} 
    } 
} 
-1

Użyj tego Youtube Embed API z google.

+0

Do mojego zrozumienia, aby korzystać, że muszę mieć aplikację YouTube na urządzeniu, To nie jest to, co chcę. – Idan

+0

Nie możesz użyć https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubePlayerView YouTubePlayerView, aby wstawić wideo bezpośrednio do swojej aplikacji. Musi to być określone działanie, ale metoda użyta do zainicjowania YouTubePlayerView nie zawiera intencji i dlatego nie może uruchomić aplikacji youtube. –

+0

Myślę, że API po prostu używa części kodu plików biblioteki, które są dołączone do aplikacji YouTube. Tak więc każdy użytkownik aplikacji musi mieć aplikację YouTube na swoim telefonie. Twoja aplikacja może zapytać, czy jest zainstalowana, i w inny sposób poprowadzić użytkownika do jej instalacji. –

0

Jakość obrazu zależy od szybkości połączenia z wykorzystaniem API

alternatywnie na inne niż API oznacza bez aplikacji YouTube można śledzić ten link