37

我正在使用 WebView 来显示嵌入的 Youtube 视频,它适用于 Galaxcy S2 (OS 2.3.5) 而不适用于 Nexus S (OS 2.3.4),我得到的只是没有任何视频显示的白屏。

这是我正在使用的代码片段和清单文件中的声明:

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

注意:参数“selected_video”是视频的哈希值(VideoID)。

Manifest 文件中的声明:

<?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"  >

    .
    .

请让我知道,以防您发现我应该在我的代码中更改任何内容,或者帮助提供一个完整的代码,该代码可以支持所有 Android 设备和操作系统,以显示高质量的嵌入式(应用内)Youtube 视频。

更新:注意,我正在寻找的解决方案应该显示高分辨率视频。我使用 VideoView 类让它在不同的设备和操作系统上工作,但视频质量不够好。因此,任何解决方案,包括 VideoView 或 WebView 或任何其他方式,只有在显示高质量的 YouTube 视频时才会被接受。感谢所有响应者!

4

9 回答 9

45

您可以使用官方的YouTube Android Player API 。这有点复杂,但它比使用 webclients 的其他解决方案工作得更好。

首先,您必须在Googles API Console中注册您的应用程序。在您的应用每月收到超过 25,000 个请求(或类似的请求)之前,这是完全免费的。链接下有完整的和很棒的教程。我希望你能理解他们。如果没有,请问!:)

于 2013-06-27T17:35:40.297 回答
7

它的外观:

在此处输入图像描述

我的情况的最佳解决方案。我需要适合网络视图大小的视频。 使用您的视频 ID 嵌入 youtube 链接。 例子:

WebView youtubeWebView; //todo find or bind web view
String myVideoYoutubeId = "-bvXmLR3Ozc";

outubeWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
        });

WebSettings webSettings = youtubeWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);

youtubeWebView.loadUrl("https://www.youtube.com/embed/" + myVideoYoutubeId);

网页查看xml代码

<WebView
        android:id="@+id/youtube_web_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>
于 2018-06-11T13:27:25.810 回答
4

虽然我建议使用 youtube api 或调用新意图并让系统处理它(即 youtube 应用程序),但这里有一些可以帮助你的代码,它调用了一个隐藏的方法,因为你不能暂停和恢复 webview

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)
        {}
    }
}
于 2013-06-28T23:48:29.327 回答
3

它是这样工作的:

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

    }
};
于 2013-06-25T06:49:38.057 回答
1

在 Android 中嵌入 YouTube 播放器非常简单,只需 10 分钟,

1) Enable YouTube API from Google API console
2) Download YouTube player Jar file
3) Start using it in Your app

以下是详细步骤http://www.feelzdroid.com/2017/01/embed-youtube-video-player-android-app-example.html

只需参考它,如果您遇到任何问题,请告诉我,我会帮助您

于 2017-01-28T08:53:22.127 回答
0

视频质量取决于使用 API 的连接速度

或者,对于没有 YouTube 应用程序的 API 方式以外的其他方式,您可以点击此链接

于 2013-07-17T20:39:47.140 回答
0

请参阅此答案:我们如何使用 webview 在 Android 应用程序中播放 YouTube 嵌入代码?

它使用WebViews并加载iframe其中...是的,它可以工作。

于 2015-07-14T09:48:26.420 回答
0

非常简单:只需将其放在静态方法中即可。

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(linkYouTube)));
于 2019-03-02T20:11:19.520 回答
-1

使用谷歌的这个Youtube Embed API

于 2013-06-29T02:26:17.890 回答