如何让我的应用程序显示在应用选择器中?

4

我希望宣传一下我的应用程序可以查看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的输出:
ACTION:android.intent.action.VIEW
DATA:file:/// storage / sdcard0 / Download / download.pdf TYPE:application / pdf
FLAGS: FLAG_ACTIVITY_FORWARD_RESULT FLAG_ACTIVITY_PREVIOUS_IS_TOP
EXTRAS: EXTRA 1: Class:java.lang.Boolean Key:preview Value:false EXTRA 2: Class:java.lang.String Key:key_filename Value:/ storage / sdcard0 / Download / download.pdf EXTRA 3: Class:android.net.Uri $ HierarchicalUri Key:android.intent.extra.STREAM EXTRA 4: Class:java.lang.Integer Key:sort_order Value:0
2个活动匹配此意图: Polaris Viewer 4.1(com.infraware.polarisviewer4-com.infraware.polarisoffice4.OfficeLauncherActivity) Rollout PdfEditor(com.example.rolloutpdfeditor-com.example.rolloutpdfeditor.MainActivity)>

Polaris Viewer是您默认的应用程序,可以用于此类“意图”吗?转到“设置”->“应用程序”->“Polaris Viewer”,在“默认启动项”下单击“清除默认值”。 - Xaver Kapeller
正如我在帖子中所说,它显示“未设置默认值”。清除默认值按钮无法点击。 - Chancelot
你在另一台设备上测试过吗?如果你的“Activity”与“Intent”匹配,而另一个不是默认值,那么应该显示一个选择器对话框。 - Xaver Kapeller
在另一台设备上尝试了一下,结果相同。不同之处在于这次使用的是Adobe Reader而不是Polaris。同样,Adobe Reader没有设置默认值。 - Chancelot
1个回答

6
你缺少必要的<category />标签在你的IntentFilter中!如果你查看<category />的文档,它会说:
备注:为了接收隐式意图,您必须在意图过滤器中包含CATEGORY_DEFAULT类别。方法startActivity()和startActivityForResult()将所有意图视为声明了CATEGORY_DEFAULT类别。如果您在意图过滤器中未声明它,则没有隐式意图将解析到您的活动。
因此,您总是需要将android.intent.category.DEFAULT作为IntentFilter类别包含在内才能正常工作。如果您希望您的应用程序能够从浏览器或其他应用程序处理pdf链接,您还需要包括android.intent.category.BROWSABLE。关于BROWSABLE,您可以在这里找到文档。它读取: CATEGORY_BROWSABLE
目标活动允许自己被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>

我认为你漏掉了这两个类别。

谢谢,那个方法可行。我没有意识到类别对于匹配意图是必要的。我需要再多读一些相关资料。 - Chancelot
1
当你想让这些东西工作时,类别是非常重要的。你可以在这里这里找到更多信息。我很高兴能够帮助! - Xaver Kapeller
请不要忘记接受这个答案!这表示对其他人来说,这是解决你问题的答案!作为小小的奖励,我们都会从中获得声誉! - Xaver Kapeller
你是如何确定特定意图使用了哪些类别的? - Chancelot
那是棘手的部分。大多数情况下,您可以在文档中查找。或者在互联网上的其他地方,但使更模糊的“意图”起作用可能会非常困难。但在这种特定情况下,我查看<category />的文档here,它几乎告诉您,您必须始终包括android.intent.category.DEFAULT才能使IntentFilter正常工作。 android.intent.category.BROWSABLE只是为了让您的应用程序还可以处理来自浏览器等的链接。 - Xaver Kapeller

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