154

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

4

18 回答 18

275

这个怎么样:

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);
    }
}  
于 2012-09-15T17:03:02.523 回答
180

根据Lemmy 的回答,这将适用于设备,但不适用于模拟器

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
于 2009-08-21T02:28:47.023 回答
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 应用程序的设备上运行,因此这应该不是问题。

于 2011-08-18T22:45:45.333 回答
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); 
于 2011-09-07T12:56:47.170 回答
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。

于 2010-11-15T05:00:02.103 回答
8

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

于 2009-03-01T02:27:59.097 回答
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 我更喜欢哪个包来打开我的意图。

于 2012-02-21T09:31:45.447 回答
6

找到了:

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) }
于 2009-03-18T19:41:04.000 回答
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);

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

于 2011-07-21T18:45:55.433 回答
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);
}
于 2017-02-17T00:12:55.327 回答
3

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

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

于 2014-02-10T12:05:30.263 回答
3
/**
 * 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;
}
于 2014-10-04T05:37:12.060 回答
3

如果安装了 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 ) );
于 2017-11-06T13:40:12.253 回答
2

你也可以抓住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;
}

在我的应用程序中运行良好。

于 2010-11-08T23:47:32.423 回答
2

尝试这个:

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

    }
  }
}
于 2011-03-21T09:36:16.667 回答
2

这个函数对我来说很好......只需在函数中传递 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);
                }
}
于 2017-11-13T09:10:56.770 回答
1

尝试这个,

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");
于 2010-11-09T09:35:49.437 回答
1

如果安装了 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);
}
于 2018-01-19T14:35:44.357 回答