【问题标题】:Android YouTube app Play Video IntentAndroid YouTube 应用播放视频意图
【发布时间】:2010-10-09 02:53:22
【问题描述】:

我创建了一个应用程序,您可以在其中下载适用于 Android 的 YouTube 视频。现在,我想要它,这样如果你在 YouTube 原生应用中播放视频,你也可以下载它。为此,我需要知道 YouTube 原生应用为播放 YouTube 应用而发出的 Intent。
如果我的模拟器上有 YouTube 程序,我可以轻松做到这一点,所以我的第一个问题是:
1. 我可以为我的模拟器下载 YouTube 应用吗,或者...
2. 用户选择视频播放时的意图是什么。

【问题讨论】:

  • 嘿,我也在尝试制作一个 youtube 视频下载器应用程序。所以,我想知道我必须为此获取任何 api 密钥,或者我可以在我的应用程序中使用 webview? @ASP

标签: android youtube android-intent emulation


【解决方案1】:

这个函数对我来说很好用...只需在函数中传递 url 字符串:

void watch_video(String url)
{
    Intent yt_play = new Intent(Intent.ACTION_VIEW, Uri.parse(url))
    Intent chooser = Intent.createChooser(yt_play , "Open With");
                
    if (yt_play.resolveActivity(getPackageManager()) != null) {
                    startActivity(chooser);
                }
}

【讨论】:

    【解决方案2】:

    这个怎么样:

    public static void watchYoutubeVideo(Context context, String id){
        Intent appIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + id));
        Intent webIntent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("http://www.youtube.com/watch?v=" + id));
        try {
            context.startActivity(appIntent);
        } catch (ActivityNotFoundException ex) {
            context.startActivity(webIntent);
        }
    }  
    

    【讨论】:

    • 支持 YouTube 应用(如果可用)的道具,并在必要时回退到网络浏览器。对于那些提出这个问题的人,这是可以使用的答案。
    • 如何启动 youtube 应用程序以通过关键字进行搜索,例如。我希望启动 youtube 应用程序,然后在该搜索中搜索“史蒂夫·乔布斯”
    • @RusheelJain 这将是一个新问题。我要做的是搜索“android youtube 意图搜索文本”或类似的东西。
    • 恕我直言,这应该是公认的答案。非常感谢!
    • 这是答案,但也许你应该在函数声明中删除静态
    【解决方案3】:

    如果安装了 Youtube 应用,您可以使用 Youtube Android 播放器 API 播放视频,否则只会提示用户从可用的网络浏览器中进行选择。

    if(YouTubeIntents.canResolvePlayVideoIntent(mContext)){
                        mContext.startActivity(YouTubeIntents.createPlayVideoIntent(mContext, mVideoId));
    }else {
        Intent webIntent = new Intent(Intent.ACTION_VIEW, 
               Uri.parse("http://www.youtube.com/watch?v=" + mVideoId));
    
        mContext.startActivity(webIntent);
    }
    

    【讨论】:

      【解决方案4】:
      Intent videoClient = new Intent(Intent.ACTION_VIEW);
      videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
      startActivityForResult(videoClient, 1234);
      

      videoId 是必须播放的 youtube 视频的视频 ID。此代码在 Motorola Milestone 上运行良好。

      但基本上我们可以做的是检查启动 Youtube 应用时加载了什么活动,并相应地替换 packageName 和 className。

      【讨论】:

      • 我收到以下错误。 ERROR/AndroidRuntime(1519): Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.google.android.youtube/com.google.android.youtube.PlayerActivity}; have you declared this activity in your AndroidManifest.xml? 请解决这个问题。
      • 你的设备是什么?此活动名称仅特定于摩托罗拉里程碑,但如果您想在 USB 调试模式下查看 youtube 活动插件的活动名称并在单击 Youtube 应用程序时查看 LogCat。它应该为您提供带有活动名称的包名称。
      【解决方案5】:

      编辑:事实证明,以下实现在至少某些 HTC 设备上存在问题(它们崩溃了)。出于这个原因,我不使用 setclassname 并坚持使用动作选择器菜单。我强烈反对使用我的旧实现。

      以下是旧实现:

      Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(youtubelink));
      if(Utility.isAppInstalled("com.google.android.youtube", getActivity())) {
          intent.setClassName("com.google.android.youtube", "com.google.android.youtube.WatchActivity");
      }
      startActivity(intent);
      

      Utility 是我自己的个人实用程序类,方法如下:

      public static boolean isAppInstalled(String uri, Context context) {
          PackageManager pm = context.getPackageManager();
          boolean installed = false;
          try {
              pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
              installed = true;
          } catch (PackageManager.NameNotFoundException e) {
              installed = false;
          }
          return installed;
      }
      

      首先我检查是否安装了 youtube,如果安装了,我告诉 android 我更喜欢哪个包打开我的意图。

      【讨论】:

      • 什么是效用?我不认为它是一个可用的导入。
      • +1 表示编辑。使用显式的类名肯定是不可靠的。
      【解决方案6】:

      试试这个,

      WebView webview = new WebView(this); 
      
      String htmlString = 
          "<html> <body> <embed src=\"youtube link\"; type=application/x-shockwave-flash width="+widthOfDevice+" height="+heightOfDevice+"> </embed> </body> </html>";
      
      webview.loadData(htmlString ,"text/html", "UTF-8");
      

      【讨论】:

      • 这对我也不起作用。模拟器中有没有flash player的要求。
      【解决方案7】:

      我是这样解决这个问题的:

      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube://" + video_id));
      startActivity(intent);
      

      现在我做了更多研究,看起来我只需要 'vnd.youtube:VIDEO_ID' 而不是冒号后的两个斜杠(':' vs. '://'):

      http://it-ride.blogspot.com/2010/04/android-youtube-intent.html

      我在这里尝试了大部分建议,但对于所有引发异常的所谓“直接”方法,它们并不能很好地工作。我会假设,使用我的方法,如果未安装 YouTube 应用程序,则操作系统具有默认的后备位置,而不是使应用程序崩溃。该应用理论上只能在装有 YouTube 应用的设备上运行,所以这应该不是问题。

      【讨论】:

      • 您好,是否可以在 App 中播放 youtube 视频而不是在 Webview 中播放?
      • @Scorpion 有 youtube API,有这种可能性。
      • 效果很好!但是您在第一行缺少一个右括号。
      【解决方案8】:

      如果安装了 youtube 应用程序,这将起作用。如果没有,则会出现一个选择器来选择其他应用程序:

      Uri uri = Uri.parse( "https://www.youtube.com/watch?v=bESGLojNYSo" );
      uri = Uri.parse( "vnd.youtube:" + uri.getQueryParameter( "v" ) );
      startActivity( new Intent( Intent.ACTION_VIEW, uri ) );
      

      【讨论】:

        【解决方案9】:

        在其他应用上运行视频的最安全方法是首先尝试解析包,换句话说,检查该应用是否已安装在设备上。因此,如果您想在 youtube 上播放视频,您可以这样做:

        public void playVideo(String key){
        
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + key));
        
            // Check if the youtube app exists on the device
            if (intent.resolveActivity(getPackageManager()) == null) {
                // If the youtube app doesn't exist, then use the browser
                intent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse("http://www.youtube.com/watch?v=" + key));
            }
        
            startActivity(intent);
        }
        

        【讨论】:

          【解决方案10】:

          这将适用于设备,但不适用于模拟器Lemmy's answer

          startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
          

          【讨论】:

          • 这是我的赢家,如果您安装了 youtube 应用程序,它会询问您是否要使用它。
          • 使用此代码我得到了 youtube 和浏览器的意图选择器。如何隐藏它?我只需要直接链接到 youtube 播放器。
          • @Praveen Chandrasekaran youtube 应用程序可能不可用 - 最好使用 Intent,并让系统确定哪些已安装应用程序支持该请求。
          • 在调用 startActivity 之前,您需要在 Intent 上调用 setClassName,如下所示:intent.videoClient.setClassName("com.google.android.youtube", "com.google.android.youtube.玩家活动");请参阅 Sana 的答案以获取有效的代码示例。
          • 这对我不起作用,在安装了 youtube 应用程序的真实设备上。它仍然会打开网络浏览器。 Bibbity 下面的方法虽然有效。或者也许是 Symmetric 的评论,没有尝试过。
          【解决方案11】:
          /**
           * Intent to open a YouTube Video
           * 
           * @param pm
           *            The {@link PackageManager}.
           * @param url
           *            The URL or YouTube video ID.
           * @return the intent to open the YouTube app or Web Browser to play the video
           */
          public static Intent newYouTubeIntent(PackageManager pm, String url) {
              Intent intent;
              if (url.length() == 11) {
                  // youtube video id
                  intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube://" + url));
              } else {
                  // url to video
                  intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
              }
              try {
                  if (pm.getPackageInfo("com.google.android.youtube", 0) != null) {
                      intent.setPackage("com.google.android.youtube");
                  }
              } catch (NameNotFoundException e) {
              }
              return intent;
          }
          

          【讨论】:

            【解决方案12】:

            Youtube 现在有一个播放器 api,你应该试试。

            https://developers.google.com/youtube/android/player/

            【讨论】:

              【解决方案13】:

              回复老问题,只是为了通知你们包已经改变,这里是更新

              Intent videoClient = new Intent(Intent.ACTION_VIEW);
              videoClient.setData("VALID YOUTUBE LINK WITH HTTP");
              videoClient.setClassName("com.google.android.youtube", "com.google.android.youtube.WatchActivity");
              startActivity(videoClient);
              

              这很好用,但是当您使用 ACTION_VIEW 和有效的 youtube URL 调用普通 Intent 时,用户仍然会得到 Activity 选择器。

              【讨论】:

                【解决方案14】:

                使用我的代码..我可以使用此代码播放 youtube 视频...您只需在“videoId”变量中提供 youtube 视频 ID ....

                String videoId = "Fee5vbFLYM4";
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId)); 
                intent.putExtra("VIDEO_ID", videoId); 
                startActivity(intent); 
                

                【讨论】:

                • 这会直接启动 YouTube 应用程序,绕过选择器菜单,您可以在其中选择 chrome 和 YouTube on JellyBean。
                • @r1k0 Yes .... 此代码将直接启动默认的 Youtube 应用以在所有类型的 android oses 中播放 youtube 视频(不仅在 JellyBean 中)。
                • 如果您有多个 youtube 播放器应用程序(例如 Firetube),它仍然会让您做出选择。只是说清楚。
                【解决方案15】:

                试试这个:

                public class abc extends Activity implements OnPreparedListener{
                
                  /** Called when the activity is first created. */
                
                  @Override
                    public void onCreate(Bundle savedInstanceState)
                  {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.main);
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));          
                
                
                    @Override
                      public void onPrepared(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                
                    }
                  }
                }
                

                【讨论】:

                  【解决方案16】:

                  你也可以直接抢WebViewClient

                  wvClient = new WebViewClient() {
                  @Override
                  public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    if (url.startsWith("youtube:")) {
                      String youtubeUrl = "http://www.youtube.com/watch?v="
                      + url.Replace("youtube:", "");
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(youtubeUrl)));
                  }
                  return false;
                  }
                  

                  在我的应用中运行良好。

                  【讨论】:

                  • 记住这一点 - Google 绝不允许在 Webview 中播放 youtube 视频。因为他们提供了 Youtube API 来在 Android App 上播放 Youtube 视频。如果您将在 webview 中播放 Youtube 视频,那么 Google 将从 Playstore 中删除您的应用程序。
                  【解决方案17】:

                  找到了:

                  03-18 12:40:02.842: INFO/ActivityManager(68): Starting activity: Intent { action=android.intent.action.VIEW data=(URL TO A FLV FILE OF THE VIDEO) type=video/* comp={com.google.android.youtube/com.google.android.youtube.YouTubePlayer} (has extras) }
                  

                  【讨论】:

                  • 太棒了!那么您是否为此创建了一个广播接收器?
                  【解决方案18】:

                  Youtube(和 Market 应用程序)只能与特殊的 ROM 一起使用,这些 ROM 是 Google 为 G1 和 G2 发布的。因此,不幸的是,您不能像在模拟器中使用的那样在 OpenSource-ROM 中运行它们。好吧,也许你可以,但不是以官方支持的方式。

                  【讨论】:

                  • 你知道不支持的方式吗?
                  • 对不起,没有。只是不想排除这种可能性。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-07-18
                  • 2012-10-17
                  • 2014-02-12
                  • 2010-12-07
                  相关资源
                  最近更新 更多