安卓YouTube应用播放视频意图

155

我创建了一个应用程序,可以在Android上下载YouTube视频。现在,我希望当您在YouTube本机应用程序中播放视频时,也可以下载它。为此,我需要知道YouTube本机应用程序发出的Intent以播放YouTube应用程序。
如果我在模拟器上安装了YouTube程序,那么我可以很容易地做到这一点,因此我的第一个问题是:
1. 我能否为我的模拟器下载YouTube应用程序,或者...
2. 当用户选择播放视频时使用的意图是什么。


嘿,我也在尝试制作一个YouTube视频下载器应用程序。所以,我想知道我是否需要获取任何API密钥,还是可以在我的应用程序中使用Webview?@ASP - Jaydip Kalkani
19个回答

278

那么这个呢:

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

6
如果可用,感谢支持YouTube应用程序,并在必要时回退到Web浏览器。对于那些来到这个问题的人,这就是要使用的答案。 - Leah Sapan
如何通过关键字启动YouTube应用程序进行搜索 例如,我想启动YouTube应用程序,然后在其中搜索“史蒂夫·乔布斯” - Rusheel Jain
@RusheelJain 那将是一个新问题。我会搜索“android youtube intent search text”或类似的内容。 - voghDev
1
这是答案,但也许你应该在函数声明中移除 static 关键字。 - Ampersanda
如何知道使用"vnd.youtube" + id解析URI会直接打开YouTube应用?是否有文档定义了这样的"快捷方式"?我的意思是"mailto:"相对常见,但"vnd.youtube"是什么意思? - citizen_code
显示剩余2条评论

181

根据Lemmy的回答,这可以在设备上正常工作,但不能在模拟器上工作。

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

这个对我来说是最好的选择,如果你已经安装了YouTube应用程序,它会询问你是否想使用该应用。 - Tristan Warner-Smith
3
在调用startActivity之前,您需要在Intent上调用setClassName方法,如下所示:intent.videoClient.setClassName("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); 可以参考Sana的答案中的代码示例。 - Symmetric
这对我不起作用,在已安装YouTube应用的真实设备上。它仍然会打开Web浏览器。下面Bibbity的方法是有效的。或者也许Symmetric的评论,我还没有尝试过。 - Mathias Conradt
使用这段代码时,我能够播放视频,但在选择浏览器后,它会加载 YouTube 网页并需要点击,有没有办法避免这一步骤? - sajith
嗯,有些相同但也有所不同。除了你有一个一行代码的解决方案 ;) 但这个也可以工作。 - bass.t
显示剩余4条评论

35

以下是我解决这个问题的方法:

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应用程序的设备,因此这应该不是问题。


你好,是否有可能在应用程序中播放YouTube视频,而不是在Webview中播放? - Scorpion
@Scorpion 有YouTube API,具有这样的可能性。 - Matthewek
1
它运行得很好!但是你在第一行缺少一个右括号。 - KostasC

21

使用我的代码..我能够使用这段代码播放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); 

3
这将直接打开YouTube应用程序,跳过在JellyBean上可以选择chrome和YouTube的选择器菜单。 - r1k0
2
@r1k0 是的....这段代码将直接启动默认的Youtube应用程序,在所有类型的Android操作系统中播放YouTube视频(不仅仅是在JellyBean中)。 - Soubhab Pathak
1
如果您有多个YouTube播放器应用程序(例如Firetube),它仍然会让您进行选择。只是说清楚了。 - Redoman

12
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? `请解决这个问题。 - Vinothkumar Arputharaj
你的设备是什么?这个活动名称只适用于Motorola Milestone,但如果你想查看Youtube活动插件的活动名称,请将你的设备连接到USB调试模式,并在点击Youtube应用时查看LogCat。它应该会给出包名和活动名称。 - Sana

8

Youtube(以及Market应用程序)只能与Google为G1和G2发布的特殊ROM一起使用。因此,您无法在开源ROM中运行它们,例如模拟器中使用的ROM。很遗憾,也许您可以尝试,但这不是官方支持的方式。


你知道不被支持的方法吗? - Isaac Waller
抱歉,不行。只是不想排除可能性。 - Lemmy

7

编辑:以下实现在至少一些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我想用哪个包来打开我的意图。


什么是Utility?我没有看到它作为可用的导入。 - IgorGanapolsky
使用显式类名是不可靠的。+1 补充说明。 - Giulio Piancastelli

7

找到了:

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

太棒了!那么你是刚刚为此创建了广播接收器吗? - Dan

5

回答旧问题,只是想告诉大家包已经改变了,以下是更新内容:

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

这个方法很有效,但当你使用有效的YouTube URL调用常规的ACTION_VIEW Intent时,用户仍然会得到Activity选择器。

5

在不同的应用程序上运行视频的最安全方法是先尝试解决包,换句话说,检查设备上是否安装了该应用程序。因此,如果您想在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);
}

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