在Android应用程序中嵌入Youtube视频

38
我正在使用 WebView 来显示嵌入的 YouTube 视频,这在 Galaxcy S2 (OS 2.3.5) 上可以工作,但在 Nexus S (OS 2.3.4) 上不行,所有我只能看到一个白屏,没有视频显示。以下是我使用的代码片段以及 Manifest 文件中的声明:
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)。
清单文件中的声明:
<?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"  >

    .
    .
请告诉我是否有任何需要改变的地方,或者提供一份完整的代码来支持在所有安卓设备和操作系统上显示嵌入式(应用内)高质量Youtube视频。
更新: 请注意,我需要的解决方案应该能够显示高分辨率视频。我已经使用VideoView类在不同的设备和操作系统上实现了它,但是视频质量并不够好。因此,任何包括VideoView或WebView或其他方式的解决方案都将被接受,只要它能够显示高质量的YouTube视频即可。感谢所有回答者!

我不确定,但可能是Flash问题,Nexus S中安装了Flash吗?https://dev59.com/olbTa4cB1Zd3GeqP_5OE - idan
我可以在我的Nexus S上使用其他具有相同功能的应用程序。我不希望使用该应用时必须安装Flash... - Idan
我的意思是,我认为它不起作用是因为Youtube需要Flash,请检查设备是否可以浏览YouTube网站并观看电影?然后告诉我结果(不要尝试使用YouTube应用程序,只需使用YouTube网站)。也许可以尝试使用其他应用程序,例如YouTube Android播放器?https://developers.google.com/youtube/android/player/ - idan
我可以在YouTube网站上观看电影,而无需使用应用程序。 - Idan
1
webview.getSettings().setPluginsEnabled(true); 是一个已弃用的方法,请尝试将目标最小SDK版本设置为8(2.2),并设置webview.getSettings().setPluginState(WebSettings.PluginState.ON); - idan
显示剩余2条评论
9个回答

45

有一个官方的YouTube Android播放器API,您可以使用它。这比使用Web客户端的其他解决方案要复杂一些,但效果更好。

首先,您必须在Google API控制台中注册您的应用程序。这完全免费,直到您的应用程序每月超过25,000次请求(或类似数量)。在链接下面有完整的和非常好的教程。我希望您能理解它们。如果不能,请提问! :)


谢谢!我太傻了,竟然没找到 YouTube 的 API。哈哈 - Luis Pena
9
Youtube 安卓播放器 API 需要安装 Youtube 应用和 Google Play 服务,但嵌入式 Youtube 视频可以在任何设备上运行。 - vuhung3990
请帮忙解决问题:https://stackoverflow.com/q/67406221/13146544 最小播放器样式中的时间条不起作用。 - Samudra Ganguly
请注意YouTube Android Player API。它将在2023年5月1日后被弃用。 - Schrami
如何在Android中使用iframe删除/隐藏下一个和上一个按钮?我正在参考https://stackoverflow.com/questions/58855620/how-can-we-remove-hide-the-next-and-previous-arrow-icons-from-youtube-iframe,但它对于Android没有帮助。 - Gyan Swaroop Awasthi

8

外观如何:

enter image description here

对于我的情况,最好的解决方案是我需要视频适应Web视图大小。 使用嵌入式YouTube链接和您的视频ID。 例如:

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

4
尽管我建议使用YouTube API或调用新的intent并让系统处理它(即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)
        {}
    }
}

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

    }
};

这段代码无法编译(metrics 应该是 Metrics)。"your url" 应该填什么?你能提供一个更好的例子吗? - Idan
这行代码具体是做什么的? frame.removeView(video); - Ajith M A

1

YouTube播放器API有一个限制,它需要在设备上安装Play服务和YouTube应用程序。如果这对您的目标受众不是问题,那么可以采用这个解决方案。 - Ajith M A

0

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

如果不使用YouTube应用程序,您可以通过此link进行其他替代方案。


0

0
很简单:只需将它放在一个静态方法中即可。
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(linkYouTube)));

-1

据我理解,要使用它,我必须在设备上安装YouTube应用程序,这不是我想要的。 - Idan
你不能使用https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubePlayerView来直接将视频插入到你的应用程序中吗?它需要一个特定的活动,但用于启动YouTubePlayerView的方法不包括意图,因此无法启动YouTube应用程序。 - Dylan Vander Berg
我认为该API只是使用随YouTube应用程序提供的库文件中的代码部分。因此,您的应用程序用户需要在其手机上安装YouTube应用程序。您的应用程序可以查询以查看是否已安装,否则引导用户安装它。 - Gunnar Forsgren - Mobimation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接