【问题标题】:Android: starting a default application or one which may be different on different devicesAndroid:启动默认应用程序或在不同设备上可能不同的应用程序
【发布时间】:2012-01-24 08:54:26
【问题描述】:

我想启动一个默认应用程序:浏览器、通讯录、电话、电子邮件、音乐应用程序等。我发现了很多 q/a,比如浏览器打开特定 URL 或blank,和here答案甚至是“不,不可能”。但我想打开/启动它而不告诉它转到特定的 URL 或向某人发送邮件等。

但是,我也看到了一些家庭应用程序似乎可以正常工作(至少对于某些应用程序)。例如,在我同事的设备上,有一个不同的通讯录(没有谷歌)被检测到并正确打开。

我在 Android 文档中看到了一些指向这些问题的意图类别,但这些只是 >= API.11。所以我不能在我的设备上使用/测试它们。

问题:在不提供额外数据的情况下,是否无法以某种方式启动默认应用程序(当然可以使用应用程序选择器)?如果不是,您认为这些家庭应用程序在做什么(也许有一些变通方法)。

PS:对于我认为的电话应用程序,我有一个使用 Intent.ACTION_DIAL 的解决方法,无需任何其他信息,只需打开拨号器。

更新:我修改了标题。某些应用程序(例如地址簿)在不同设备上可能不一样。所以在这种情况下,我想启动地址簿应用程序,无论是哪个。

【问题讨论】:

    标签: android default launch


    【解决方案1】:

    这个答案不是 100% 的答案,而是一些典型应用程序的一些变通方法。

    仍然开放的有:音乐播放器、通讯录

    浏览器:我得到一个处理“http”数据意图的应用程序列表,然后我查看首选应用程序列表中是否有可用的应用程序。

    Intent appFilter = new Intent(Intent.ACTION_VIEW);
    appFilter.setData(Uri.parse("http://www.google.com"));
    List<ResolveInfo> browserInfoList = pm.queryIntentActivities(appFilter, 0);
    
    List<IntentFilter> outFilters = new ArrayList<IntentFilter>();
    List<ComponentName> outActivities = new ArrayList<ComponentName>();
    pm.getPreferredActivities(outFilters, outActivities, null);
    if(outActivities.size() > 0) {
      for(ComponentName cn : outActivities) {
        String cnClass = cn.getClassName();
        String cnPkg = cn.getPackageName();
        for (ResolveInfo info : browserInfoList) {
          if(info.activityInfo.name.equals(cnClass) && 
            info.activityInfo.packageName.equals(cnPkg)) {
            return cn;
          }
        }
      }
    }
    

    如果没有找到默认值,我会打开一个浏览器选择器对话框,请参阅here

    电话:如问题所述:

    Intent intent = new Intent(Intent.ACTION_DIAL);
    startActivity(intent);
    

    【讨论】:

      【解决方案2】:

      如果您知道规范的应用名称,您可以通过“startActivity”函数启动应用 像“android.com.browser”。只需在应用程序中搜索 AndroidManifest.xml 即可轻松完成此操作 源代码(查看 Codeaurora.com 或 github/Cyanogenmod)并获取您想要的应用程序名称。 了解 App 名称(“Activity”)后,实现代码如下:

      Intent intent = new Intent();
      intent.setClassName(this, "com.android.browser");
      intent.setCategory(Intent.ACTION_MAIN);
      startActivity(intent);
      

      这只是一个示例,有时您必须添加 Intent Extras 或数据值,这些信息也可以在应用的 AndroidManifest.xml 中找到。

      【讨论】:

      • 谢谢。一旦我知道活动的类或包名,我就知道如何启动它。但我想打开用户设置的默认浏览器(或其他应用程序)(例如 Opera 或 Dolphin),如果未设置,请打开选择器对话框。但是,如果有一种方法可以获取特定类别(浏览器、电子邮件等)的默认应用程序(如果已设置),那么这也可能很有用。
      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多