【问题标题】:Embed Youtube video inside an Android app在 Android 应用程序中嵌入 Youtube 视频
【发布时间】:2013-06-08 23:22:35
【问题描述】:

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

这是我正在使用的代码 sn-p 和 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)。

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 视频时才会被接受。感谢所有响应者!

【问题讨论】:

  • 我不确定,但可能是 Flash 问题,Flash 安装在 Nexus S 中? stackoverflow.com/questions/5791035/…
  • 我可以使用其他在我的 Nexus S 上执行相同操作的应用程序。我不希望 Flash 成为必须使用该应用程序...
  • 我的意思是我认为它不起作用,因为 Youtube 需要 Flash,请检查设备是否可以浏览 YouTube 网站和观看电影?并让我知道结果(不要尝试 YouTube 应用程序只是 youtube 网站)maby ather 应用程序使用,youtube android 播放器? developers.google.com/youtube/android/player
  • 我可以在不使用该应用的情况下在 youtube 网站上观看电影。
  • webview.getSettings().setPluginsEnabled(true);是一种已弃用的方法,尝试针对 min SDK 版本 8 (2.2) 并设置 webview.getSettings().setPluginState(WebSettings.PluginState.ON);

标签: android youtube android-webview android-youtube-api


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我多么愚蠢,我找不到 youtube 的 API。大声笑
  • Youtube android player api 需要安装 youtube 应用和谷歌播放服务,但嵌入 Youtube 视频以在每台设备上运行
  • stackoverflow.com/q/67406221/13146544 如果可能,请帮助我。最小播放器样式的时间栏不起作用。
【解决方案2】:

外观:

我的情况的最佳解决方案。我需要适合网络视图大小的视频。 使用您的视频 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"/>

【讨论】:

    【解决方案3】:

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

    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)
            {}
        }
    }
    

    【讨论】:

      【解决方案4】:

      它是这样工作的:

      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)。究竟应该在“你的网址”上有什么?你能提供一个更好的例子吗?
      • 这条线到底是做什么的? frame.removeView(video);
      【解决方案5】:

      在 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

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

      【讨论】:

      • Youtube 播放器 api 有一个限制,它需要在设备上安装 Play 服务和 Youtube 应用程序。如果这对您的目标受众来说不是问题,是的,可以应用此解决方案。
      【解决方案6】:

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

      对于没有 YouTube 应用的 API 以外的其他方式,您可以关注此link

      【讨论】:

        【解决方案7】:

        参考这个答案:How can we play YouTube embeded code in an Android application using webview?

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

        【讨论】:

          【解决方案8】:

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

          startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(linkYouTube)));
          

          【讨论】:

            【解决方案9】:

            使用来自 google 的 Youtube Embed API

            【讨论】:

            • 据我了解,我必须在设备上安装 Youtube 应用,这不是我想要的。
            • 您不能使用developers.google.com/youtube/android/player/reference/com/… YouTubePlayerView 将视频直接插入您的应用程序。它必须是特定的活动,但用于启动 YouTubePlayerView 的方法不包含意图,因此无法启动 youtube 应用程序。
            • 我认为 API 只是使用 YouTube 应用程序附带的库文件的代码部分。因此,您的应用程序的任何用户都需要在手机上安装 YouTube 应用程序。您的应用可以查询它是否已安装,否则会引导用户安装它。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-27
            • 2023-03-11
            • 2013-09-23
            • 2013-07-28
            • 1970-01-01
            • 2011-03-15
            • 2018-09-05
            相关资源
            最近更新 更多