使用 Intent.ACTION_PICK 时是不是可以排除 SIM 联系人?
Posted
技术标签:
【中文标题】使用 Intent.ACTION_PICK 时是不是可以排除 SIM 联系人?【英文标题】:Is it possible to exclude SIM contacts when using Intent.ACTION_PICK?使用 Intent.ACTION_PICK 时是否可以排除 SIM 联系人? 【发布时间】:2016-05-01 17:46:21 【问题描述】:我需要在我的应用中选择联系人,并希望排除那些存储在我的 SIM 卡中的联系人。 ACTION_PICK
可以吗?
【问题讨论】:
查看此链接:***.com/questions/16651609/… 您应该使用 ContactsContract.Contacts.CONTENT_URI 自己查询并在 ListView 中显示它们。 【参考方案1】:不,不可能
很遗憾,目前不可能。
为了证明这一点,让我们深入了解ContanctsListActivity
的源代码。Here's 和Activity
的onCreate()
方法。其中,ContactApp 读取我们传递给它的Intent
(ACTION_PICK
) 并分别处理它:
@Override
protected void onCreate(Bundle icicle)
super.onCreate(icicle);
mIconSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);
mContactsPrefs = new ContactsPreferences(this);
mPhotoLoader = new ContactPhotoLoader(this, R.drawable.ic_contact_list_picture);
// Resolve the intent
final Intent intent = getIntent();
// Allow the title to be set to a custom String using an extra on the intent
String title = intent.getStringExtra(UI.TITLE_EXTRA_KEY);
if (title != null)
setTitle(title);
String action = intent.getAction();
String component = intent.getComponent().getClassName();
// When we get a FILTER_CONTACTS_ACTION, it represents search in the context
// of some other action. Let's retrieve the original action to provide proper
// context for the search queries.
if (UI.FILTER_CONTACTS_ACTION.equals(action))
mSearchMode = true;
mShowSearchSnippets = true;
Bundle extras = intent.getExtras();
if (extras != null)
mInitialFilter = extras.getString(UI.FILTER_TEXT_EXTRA_KEY);
String originalAction =
extras.getString(ContactsSearchManager.ORIGINAL_ACTION_EXTRA_KEY);
if (originalAction != null)
action = originalAction;
String originalComponent =
extras.getString(ContactsSearchManager.ORIGINAL_COMPONENT_EXTRA_KEY);
if (originalComponent != null)
component = originalComponent;
else
mInitialFilter = null;
Log.i(TAG, "Called with action: " + action);
mMode = MODE_UNKNOWN;
if (UI.LIST_DEFAULT.equals(action) || UI.FILTER_CONTACTS_ACTION.equals(action))
.....
else if (Intent.ACTION_PICK.equals(action))
// XXX These should be showing the data from the URI given in
// the Intent.
final String type = intent.resolveType(this);
if (Contacts.CONTENT_TYPE.equals(type))
mMode = MODE_PICK_CONTACT;
else if (People.CONTENT_TYPE.equals(type))
mMode = MODE_LEGACY_PICK_PERSON;
else if (Phone.CONTENT_TYPE.equals(type))
mMode = MODE_PICK_PHONE;
else if (Phones.CONTENT_TYPE.equals(type))
mMode = MODE_LEGACY_PICK_PHONE;
else if (StructuredPostal.CONTENT_TYPE.equals(type))
mMode = MODE_PICK_POSTAL;
else if (ContactMethods.CONTENT_POSTAL_TYPE.equals(type))
mMode = MODE_LEGACY_PICK_POSTAL;
....
// VERY LONG IF WITH DIFFERENT MODE-SELECTION
....
.....
if (mMode == MODE_JOIN_CONTACT)
setContentView(R.layout.contacts_list_content_join);
else if (mSearchMode)
setContentView(R.layout.contacts_search_content);
else if (mSearchResultsMode)
setContentView(R.layout.contacts_list_search_results);
else
setContentView(R.layout.contacts_list_content);
setupListView();
...
这是一个很长的方法(我也建议检查setupListView()
方法),但非常简单。而且,如您所见,您无法传递任何参数来指定要从中挑选的联系人来源。您可以在此处配置的唯一内容是要使用的特定 mMode
ContactsApp(MODE_PICK_CONTACT
、MODE_PICK_PHONE
等) - 但不幸的是,可能的模式数量非常有限,只有 6 种,而且不适合您。
(如果有人需要将mMode
传递给ContanctsListActivity
- 使用intent 的setType()
方法,例如:intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
)
解决方法
作为一种解决方法 - 正如 tiny 阳光 在 cmets 中建议的那样 - 在应用程序中呈现非 SIM 联系人并从中选择您需要的联系人。How to get all android contacts but without those which are on SIM - 此链接看起来就像最有前途的解释如何查询所有联系人的光标,除了 SIM 卡。
希望对你有帮助
【讨论】:
以上是关于使用 Intent.ACTION_PICK 时是不是可以排除 SIM 联系人?的主要内容,如果未能解决你的问题,请参考以下文章
Intent.ACTION_GET_CONTENT 和 Intent.ACTION_PICK 之间的区别
Android MediaStore.ACTION_IMAGE_CAPTURE 和 Intent.ACTION_PICK