我创建了一个应用程序,可以在Android上下载YouTube视频。现在,我希望当您在YouTube本机应用程序中播放视频时,也可以下载它。为此,我需要知道YouTube本机应用程序发出的Intent以播放YouTube应用程序。
如果我在模拟器上安装了YouTube程序,那么我可以很容易地做到这一点,因此我的第一个问题是:
1. 我能否为我的模拟器下载YouTube应用程序,或者...
2. 当用户选择播放视频时使用的意图是什么。
我创建了一个应用程序,可以在Android上下载YouTube视频。现在,我希望当您在YouTube本机应用程序中播放视频时,也可以下载它。为此,我需要知道YouTube本机应用程序发出的Intent以播放YouTube应用程序。
如果我在模拟器上安装了YouTube程序,那么我可以很容易地做到这一点,因此我的第一个问题是:
1. 我能否为我的模拟器下载YouTube应用程序,或者...
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);
}
}
根据Lemmy的回答,这可以在设备上正常工作,但不能在模拟器上工作。
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
以下是我解决这个问题的方法:
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视频...你只需要在“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);
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。
Youtube(以及Market应用程序)只能与Google为G1和G2发布的特殊ROM一起使用。因此,您无法在开源ROM中运行它们,例如模拟器中使用的ROM。很遗憾,也许您可以尝试,但这不是官方支持的方式。
编辑:以下实现在至少一些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我想用哪个包来打开我的意图。
找到了:
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) }
回答旧问题,只是想告诉大家包已经改变了,以下是更新内容:
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上播放视频,可以执行以下操作:
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);
}