安卓Intent-filter问题

3
我正在尝试编写一个intent-filter,以从联系人列表中选择联系人(仅出于教育目的...我正在学习有关意图的知识)。在对隐式意图调用startActivity后,Android应该将我的自定义活动以及默认活动视为候选活动,并让我选择要使用哪个活动(意图分辨)。
但是,在我的当前设置下,它打开了Android的默认联系人选择器而没有给我选择的机会。以下是我的intent-filter。
<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);

你需要使用在这里记录的ACTION_CHOOSER:http://developer.android.com/reference/android/content/Intent.html#ACTION_CHOOSER - 很抱歉我自己不知道如何使用它,但可以尝试谷歌搜索示例。 - Squonk
1
@MisterSquonk:如果用户为此“Intent”选择了默认处理程序,则需要这样做。可以想象,内置的联系人应用程序预先确定为默认值,但我会感到惊讶,因为他们没有为我尝试覆盖的任何其他“Intents”(例如,替代主屏幕)执行此操作。 - CommonsWare
1个回答

5

尝试:

<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>

谢谢,这个方法有效。你有想法为什么在这种情况下通过 Uri 过滤意图不起作用,而通过 MIME 类型过滤可以吗? - AlephNull
@AlephNull:内容提供者URI用于查找MIME类型。引用“IntentFilter”文档中的话,“如果您指定了方案但没有类型,则仅匹配没有类型(例如mailto:)的Intent;content: URI永远不会匹配,因为它们始终具有由其内容提供者提供的MIME类型。”通常,与内容提供者相关联的活动会过滤MIME类型。此外,在这种情况下,最好按照Google的做法去做。我通过查看联系人应用程序的源代码获得了上述<intent-filter> - CommonsWare
太棒了,我感激你的帮助。最后一个问题,我在哪里可以找到联系人应用程序的源代码? - AlephNull
@AlephNull:http://source.android.com -- 点击“Source”选项卡,然后点击“Browse Source”链接,在“Contacts.git”存储库中查找,并单击该行中的“tree”链接。 - CommonsWare

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