2

我正在尝试编写一个意图过滤器来从联系人列表中选择一个联系人(纯粹为了教育目的......我正在学习意图)。在隐式意图调用startActivity之后,android应该找到我的自定义活动以及作为候选活动的默认活动,并让我选择我想使用哪一个(intent resolution)。Android意图过滤器问题

但是,使用我目前的设置,它会打开android的默认联系人选择器,而不会给我选择。这是我的意图过滤器。

<activity android:name=".ContactPicker" android:label="PICKER" > 
    <intent-filter> 
     <action android:name="android.intent.action.PICK" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="content" android:host="com.android.contacts" android:path="contacts" /> 
    </intent-filter> 
</activity> 

,这里是我如何打电话的主要活动隐含的意图:

Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://com.android.contacts/contacts")); 
startActivityForResult(intent, PICK_CONTACT); 
+0

您需要使用ACTION_CHOOSER这里记录的http://开发商。 android.com/reference/android/content/Intent.html#ACTION_CHOOSER - 抱歉,我不知道如何自己使用它,但尝试谷歌搜索的例子。 – Squonk

+1

@MisterSquonk:如果用户为这个“Intent”选择了一个默认处理程序,那将是必要的。可以想象,内置的联系人应用程序已预先确定为默认设置,但我会感到惊讶,因为他们不会为我尝试覆盖的任何其他“内容”(例如,替代主屏幕)。 – CommonsWare

回答

4

尝试:

<intent-filter> 
    <action android:name="android.intent.action.PICK"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="vnd.android.cursor.dir/contact"/> 
</intent-filter> 
+0

谢谢,这工作。任何想法为什么通过Uri过滤意图在这种情况下不起作用,并通过MIME类型过滤吗? – AlephNull

+0

@AlephNull:内容提供者URI用于查找MIME类型。引用'IntentFilter'文档,“如果你指定一个方案,但没有类型,只有没有类型的Intent(比如mailto :)会匹配; content:URI永远不会匹配,因为它们总是有一个MIME类型由他们的内容提供商提供。“通常,与MIME类型上的内容提供者过滤相关的活动。此外,在这种情况下,通过Google做的事情,您总是可以得到最好的服务。通过查看联系人应用程序的源代码,我得到了上面的。 – CommonsWare

+0

太棒了,感谢您的帮助。最后一个问题,我在哪里可以找到联系人应用程序的源代码? – AlephNull