播放视频意图

我已经开发了一个应用程序,你可以在那里下载安卓的 YouTube 视频。现在,我想要它,这样如果你播放一个视频在 YouTube 本地应用程序,你也可以下载它。要做到这一点,我需要知道 YouTube 本地应用程序为了播放 YouTube 应用程序而发出的意图。
如果在我的模拟器上安装了 YouTube 程序,我就可以轻松地完成这个任务,所以我的第一个问题是:
1. 我可以下载我的模拟器的 YouTube 应用程序,还是..。
2. 用户选择播放视频时的意图是什么。

228127 次浏览

Youtube (以及 Market 应用程序)只能与特殊的 ROM 一起使用,这些 ROM 是 Google 为 G1和 G2发布的。不幸的是,您无法在 OpenSource-ROM 中运行它们,就像在模拟器中使用的那样。也许你可以,但不是以官方支持的方式。

找到了:

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

这将工作在 一个装置,但不是 模拟器Lemmy 的回答

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

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

在我的应用里很管用。

试试这个,

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");
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);

其中 videoId是必须播放的 youtube 视频的视频 ID。这个代码在 摩托罗拉里程碑上运行良好。

但基本上我们可以做的是检查在启动 Youtube 应用程序时加载了哪些活动,并相应地替换 packageName 和 className。

试试这个:

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


}
}
}

回答老问题,只是通知你们,包已经改变,这里的更新

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 用户的普通意图时,仍然会得到 Activity 选择器。

我是这样解决这个问题的:

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 视频使用这个代码... 你只需要提供 youtube 视频 ID 在“ video Id”变量... 。

String videoId = "Fee5vbFLYM4";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId));
intent.putExtra("VIDEO_ID", videoId);
startActivity(intent);

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

这样吧:

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 现在有一个播放器 api,你应该试试。

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

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

在不同的应用程序上运行视频最安全的方法是首先尝试解析包,换句话说,检查应用程序是否安装在设备上。因此,如果你想在 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 应用程序,这个选项将会工作。如果没有,一个选择器将会出现来选择其他的应用程序:

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

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

使用科特林 Extension更容易。

fun Context.watchYoutube(id: String) {
val appIntent = Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:$id"))
val webIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://youtu.be/$id")
)
try {
this.startActivity(appIntent)
} catch (ex: ActivityNotFoundException) {
this.startActivity(webIntent)
}
}

然后你可以像这样在 MainActivity.kt上实现它

fun onClickSomething(){
val linkYoutubeId = "https://youtu.be/3s21Ynn4Huw".substringAfterLast("/")
watchYoutube(linkYoutubeId)
}