【问题标题】:How to hide the Intent Chooser window in android?如何在android中隐藏意图选择器窗口?
【发布时间】:2010-05-21 14:19:53
【问题描述】:

当我点击按钮时,我会为 youtube 视频启动一个活动,如下所示:

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

如果我使用它重定向到意图选择器以在浏览器或 youtube 应用程序上打开该视频 url。如何以编程方式选择默认应用作为 youtube?

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

【问题讨论】:

    标签: android video android-intent


    【解决方案1】:

    请求特定的 Activity 是有风险的,因为 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;
    }
    

    【讨论】:

      【解决方案2】:

      您正在使用隐式意图,它可以匹配多个接收者,因此是选择器。如果您能弄清楚如何直接定位 youtube 活动,您可以尝试切换到显式意图模型。请参阅 developer documentation 了解显式意图与隐式意图。

      但是,意图选择器的原因似乎是让每个用户自己决定使用哪个播放器。你有充分的理由想绕过这个吗?如果有人安装了他们喜欢的其他视频播放器怎么办?

      编辑:要调用显式意图,您需要知道要尝试启动的活动的名称,并将其他详细信息作为附加信息传递,即:

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

      但是,我完全编造了一个事实,即有一个 YouTubeViewerActivity 类。正如我所说,通常如果您要求某些外部服务(例如 YouTube 应用)执行操作,您会像使用隐式意图模型一样使用您拥有的,因此用户可以控制所使用的应用程序。

      【讨论】:

      • 你能给出一些更容易理解的示例代码吗?谢谢
      • 你能告诉我什么是隐式 youtube 播放器活动吗?在 Logcat 中,它显示:“com.google.android.youtube/.PlayerActivity”。我该怎么办?
      • 你会使用 com.google.android.youtube.PlayerActivity。但正如 Mayra 所提到的,这是一个坏主意,因为它会惹恼可能安装了替代应用程序的人,如果有人在没有安装 YouTube 应用程序的设备上运行它,您的应用程序将会崩溃。它相当于 Android 的硬编码“iexplore.exe”来打开网页。
      猜你喜欢
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多