如何在安卓系统中隐藏意图选择器窗口?

4
当我点击按钮时,我会启动一个像这样的YouTube视频活动:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));

如果我使用这个代码,它会重定向到意图选择器,并在浏览器或YouTube应用程序中打开该视频URL。如何通过编程方式选择默认的应用程序为YouTube?

我的输出应该直接在YouTube播放器上打开该视频。怎么做?有什么想法吗?

2个回答

7

要求特定活动存在风险,因为YouTube可能会更改其包名称,这将导致您的应用程序出现故障。

此外 - 不能保证YT播放器已安装在所有Android设备上。

为了规避这个问题,这里有一个代码可以搜索YouTube活动。如果找到它,它将返回一个直接使用它的意图,否则,它将保留一个“通用”意图,这将导致系统意图选择器被显示。

/**
 * @param context
 * @param url To display, such as http://www.youtube.com/watch?v=t_c6K1AnxAU
 * @return an Intent to start the YouTube Viewer. If it is not found, will
 *         return a generic video-play intent, and system will display a
 *         chooser to ther user.
 */
public static Intent getYouTubeIntent(Context context, String url) {
  Intent videoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  final PackageManager pm = context.getPackageManager();
  List<ResolveInfo> activityList = pm.queryIntentActivities(videoIntent, 0);
  for (int i = 0; i < activityList.size(); i++) {
    ResolveInfo app = activityList.get(i);
    if (app.activityInfo.name.contains("youtube")) {
      videoIntent.setClassName(app.activityInfo.packageName, app.activityInfo.name);
      return videoIntent;
    }
  }
  return videoIntent;
}

1

您正在使用隐式意图,这可能会匹配多个接收器,因此出现了选择器。如果您可以找到如何直接定位YouTube活动,则可以尝试切换到显式意图模型。请参见开发人员文档有关显式与隐式意图的说明。

然而,似乎意图选择器的原因是让每个用户自行决定使用哪个播放器。您想绕过这个选择器的原因是什么?如果有人安装了他们喜欢的不同视频播放器怎么办?

编辑:要调用显式意图,您需要知道要启动的活动名称,并将其他详细信息作为额外内容传递,例如:

Intent intent = new Intent(this, YouTubeViewerActivity.class);
intent.addExtra("URI", Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM"));
startActivity(intent);

然而,我完全是编造了一个名为YouTubeViewerActivity的类。正如我所说,通常情况下,如果您要求外部服务(如YouTube应用程序)执行操作,则使用隐式意图模型,就像您现在所做的那样,这样用户就可以控制使用哪个应用程序。


你能提供一些更易懂的示例代码吗?谢谢。 - Praveen
请问隐式YouTube播放器Activity是什么?在Logcat中,它显示为:"com.google.android.youtube/.PlayerActivity"。我该怎么做? - Praveen
2
你可以使用com.google.android.youtube.PlayerActivity。但正如Mayra所提到的,这是一个不好的想法,因为它会让那些可能安装了替代应用程序的人感到恼怒,并且如果有人在没有安装YouTube应用程序的设备上运行它,你的应用程序将崩溃。这相当于在Android中硬编码“iexplore.exe”来打开网页。 - Christopher Orr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接