Android YouTube应用播放视频意图


148

我创建了一个应用,您可以在其中下载Android的YouTube视频。现在,我想要它,以便如果您在YouTube本机应用程序中播放视频,也可以下载它。为此,我需要知道YouTube本机应用程序为播放YouTube应用程序而展示的意图。
如果我在模拟器上安装了YouTube程序,那么我可以轻松地做到这一点,所以我的第一个问题是:
1.我可以为模拟器下载YouTube应用程序吗,还是...
2.用户选择视频时的目的是什么?播放。


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

Answers:


263

那呢:

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可能会因为垃圾邮件而暂停您的频道,这是我的两次


5
支持YouTube应用(如果可用)的提案,并在必要时使用网络浏览器。对于那些遇到这个问题的人,这就是使用的答案。
路加·萨潘

如何启动YouTube应用程序以通过关键字进行搜索,例如 我希望启动youtube应用,然后在该搜索中搜索“史蒂夫乔布斯”
Rusheel Jain

@RusheelJain那将是一个新问题。我要做的是搜索“ android youtube intent搜索文本”或类似的内容。
voghDev

2
恕我直言,这应该是公认的答案。非常感谢!
Nacho L.

1
这就是答案,但也许您应该在函数声明中删除静态变量
Ampersanda

176

根据Lemmy的回答,这将在设备上起作用,但不能在仿真器上起作用。

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

这对我来说是赢家,如果您安装了youtube应用,它会询问您是否要使用它。
Tristan Warner-Smith,2010年

使用此代码,我得到youtube和浏览器的意图选择器。怎么藏起来?我只需要直接链接到YouTube播放器。
Praveen 2010年

@Praveen Chandrasekaran youtube应用程序可能不可用-最好使用Intent,并让系统确定哪些已安装的应用程序支持该请求。
cofiem

3
您需要在调用startActivity之前在Intent上调用setClassName,如下所示:intent.videoClient.setClassName(“ com.google.android.youtube”,“ com.google.android.youtube.PlayerActivity”); 有关有效的代码示例,请参见Sana的答案。
对称

在安装了youtube应用的真实设备上,这对我不起作用。仍然会打开网络浏览器。不过,下面的Bibbity方法是可行的。也许Symmetric的评论还没有尝试过。
Mathias Conradt

33

这是我解决此问题的方法:

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

@Scorpion有youtube API,这种可能性。
马修耶克

1
效果很好!但是您在第一行缺少一个右括号。
KostasC,2016年

18

使用我的代码..我可以使用此代码播放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应用程序,而绕过选择器菜单,您可以在其中选择chrome和JellyBean上的YouTube。
r1k0 2012年

2
@ r1k0是...。此代码将直接启动默认的YouTube应用,以在所有类型的android oses中播放youtube视频(不仅在JellyBean中)。
Soubhab Pathak 2012年

1
如果您有多个youtube播放器应用(例如Firetube),它仍然会让您选择。只是说清楚。
jj_

11
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 2011年

您的设备是什么?此活动名称仅特定于Motorola Milestone,但是如果您想在USB调试模式下查看设备中youtube活动插件的活动名称,并在单击Youtube App时看到LogCat。它应该为您提供带有活动名称的软件包名称alogn。
萨那

7

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


您知道不受支持的方式吗?
艾萨克·沃勒

抱歉,没有。只是不想排除这种可能性。
Lemmy

6

编辑:下面的实现证明至少在某些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我更喜欢打开我的意图的软件包。


什么是实用程序?我不认为它是可用的导入。
IgorGanapolsky '04年

+1表示编辑。使用显式的类名绝对是不可靠的。
Giulio Piancastelli 2012年

5

找到了:

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

太棒了!那么,您只是为此创建了一个广播接收器吗?
丹丹

4

回复旧问题,只是为了通知大家软件包已更改,这是更新

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选择器。


3

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


2
/**
 * 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;
}

1

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

在我的应用程序中工作正常。


请记住,Alwasy-Google绝对不允许在Webview中播放youtube视频。因为它们提供了Youtube API来在Android App上播放Youtube视频。如果您要在网络视图中播放Youtube视频,则Google将从Playstore中删除您的应用程序。
santosh devnath,

1

试试这个:

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

    }
  }
}

0

如果安装了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 ) );

0

试试这个,

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的要求。
iCoder 2011年

0

这个函数对我来说很好用...只需在函数中传递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);
                }
}

0

如果安装了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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.