如何让我的应用出现在应用选择器中?

Posted

技术标签:

【中文标题】如何让我的应用出现在应用选择器中?【英文标题】:How do I make my app appear in app chooser? 【发布时间】:2014-09-21 04:41:06 【问题描述】:

我想宣传我的应用能够查看 pdf 文件,以便在从文件管理器中选择 pdf 文件时它会出现在应用选择器中。

这是我的意图过滤器的样子

<activity
    android:name=".MainActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:mimeType="application/pdf" />
    </intent-filter>
</activity>

每当我从文件管理器打开 pdf 时,它会自动选择另一个名为 Polaris Viewer 的 pdf 应用程序。

我检查以确保 Polaris 不是应用程序设置下的默认应用程序。它说没有设置默认值。

另外,我下载了一个名为 Intent Intercept 的第三方应用程序。如果我从文件管理器中选择一个 pdf 文件,则会出现一个显示 Polaris 和 Intent Intercept 的应用程序选择器。如果我选择 Intent Intercept,它会告诉我 Polaris 和我的应用程序(Rollout PdfEditor)都符合意图。这是 Intent Interceptor 的输出:

动作:android.intent.action.VIEW

数据:file:///storage/sdcard0/Download/download.pdf 类型:应用程序/pdf

标志: FLAG_ACTIVITY_FORWARD_RESULT FLAG_ACTIVITY_PREVIOUS_IS_TOP

附加: 额外1: 类:java.lang.Boolean 关键:预览 值:假 额外2: 类:java.lang.String 键:key_filename 值:/storage/sdcard0/Download/download.pdf 额外3: 类:android.net.Uri$HierarchicalUri 键:android.intent.extra.STREAM 额外4: 类:java.lang.Integer 键:排序顺序 值:0

2 项活动符合此意图: Polaris Viewer 4.1 (com.infraware.polarisviewer4 - com.infraware.polarisoffice4.OfficeLauncherActivity) 推出 PdfEditor (com.example.rolloutpdfeditor - com.example.rolloutpdfeditor.MainActivity) >

【问题讨论】:

Polaris Viewer 是否可能只是您对此类Intents 的默认应用程序?转到设置 -> 应用程序 -> Polaris Viewer,然后在“默认启动”下单击“清除默认值”。 正如我在帖子中所说,它说“没有设置默认值”。清除默认按钮不可点击。 那么您是否在另一台设备上测试过它?如果您的ActivityIntent 匹配,而另一个不是默认值,则应显示选择器对话框。 在另一台设备上尝试过,结果相同。只是这次是 Adob​​e Reader 而不是 Polaris。 Adobe Reader 再次没有设置默认值。 【参考方案1】:

您的IntentFilter 中缺少必需的&lt;category /&gt; 标签!如果您查看&lt;category /&gt; 的文档,它会说:

注意:为了接收隐式意图,您必须包含 意图过滤器中的 CATEGORY_DEFAULT 类别。方法 startActivity() 和 startActivityForResult() 将所有意图视为 他们声明了 CATEGORY_DEFAULT 类别。如果你不声明它 在您的意图过滤器中,没有隐式意图将解析为您的 活动。

因此,您始终必须将android.intent.category.DEFAULT 包含为IntentFilter 的类别才能正常工作。如果您希望您的应用程序能够处理来自浏览器或其他应用程序的 pdf 链接,您还需要包含 android.intent.category.BROWSABLE。您可以找到有关 BROWSABLE here 的文档。上面写着:

CATEGORY_BROWSABLE 目标 Activity 允许自己由 Web 浏览器启动,以显示链接引用的数据——例如图像或电子邮件消息。

试试这个IntentFilter:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/pdf" />
</intent-filter>

我认为您缺少这两个类别。

【讨论】:

谢谢,成功了。我没有意识到类别是匹配意图所必需的。生病必须阅读更多。 是的,当您希望这些东西发挥作用时,类别很重要。您可以在herehere 找到更多信息。我很高兴能帮上忙! 请不要忘记接受这个答案!这向其他人表明这是解决您问题的答案!作为一点奖励,我们都从中获得了声誉! 您如何确定特定意图使用的类别? 这是棘手的部分。大多数情况下,您可以在文档中查找它。或者互联网上的其他地方,但让更模糊的Intents 工作可能非常困难。但是在这种特定情况下,我查看了&lt;category /&gt;here 的文档,它几乎告诉您总是必须包含android.intent.category.DEFAULT 才能使IntentFilter 正常工作。 android.intent.category.BROWSABLE 只是为了让您的应用也可以处理来自浏览器等的链接。

以上是关于如何让我的应用出现在应用选择器中?的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道用户在应用选择器中点击了哪些应用或按钮?

Android:如何从日期和时间选择器中获取值

在选择器中访问反应路由器状态

我正在创建浏览器应用程序,但当我单击任何 URL 时,Android 不会在选择器中检测到我的应用程序

如何在选择器中快速获取所选项目的标题和项目的价值?

如何在 jQuery UI 日期选择器中禁用公共假期?