我创建了一个应用,您可以在其中下载Android的YouTube视频。现在,我想要它,以便如果您在YouTube本机应用程序中播放视频,也可以下载它。为此,我需要知道YouTube本机应用程序为播放YouTube应用程序而展示的意图。
如果我在模拟器上安装了YouTube程序,那么我可以轻松地做到这一点,所以我的第一个问题是:
1.我可以为模拟器下载YouTube应用程序吗,还是...
2.用户选择视频时的目的是什么?播放。
我创建了一个应用,您可以在其中下载Android的YouTube视频。现在,我想要它,以便如果您在YouTube本机应用程序中播放视频,也可以下载它。为此,我需要知道YouTube本机应用程序为播放YouTube应用程序而展示的意图。
如果我在模拟器上安装了YouTube程序,那么我可以轻松地做到这一点,所以我的第一个问题是:
1.我可以为模拟器下载YouTube应用程序吗,还是...
2.用户选择视频时的目的是什么?播放。
Answers:
那呢:
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可能会因为垃圾邮件而暂停您的频道,这是我的两次
根据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。
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?
请解决此问题。
编辑:下面的实现证明至少在某些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我更喜欢打开我的意图的软件包。
回复旧问题,只是为了通知大家软件包已更改,这是更新
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选择器。
在其他应用程序上运行视频的最安全方法是首先尝试解析该程序包,换句话说,检查该应用程序已安装在设备上。因此,如果您想在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);
}
YouTube现在有一个播放器API,您应该尝试一下。
/**
* 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;
}
您也可以抓住 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;
}
在我的应用程序中工作正常。
试试这个:
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
}
}
}
试试这个,
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");
这个函数对我来说很好用...只需在函数中传递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);
}
}
如果安装了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);
}