Можно ли исключить контакты SIM-карты при использовании Intent.ACTION_PICK?

Мне нужно выбрать контакты в моем приложении и хотели бы исключить те, которые хранятся на моей SIM-карте. Возможно ли это с ACTION_PICK ?

Нет, это невозможно

К сожалению, пока это невозможно.

Чтобы доказать это, давайте погрузимся в исходный код ContanctsListActivity .
Вот метод onCreate() Activity . В нем 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 в mMode – используйте метод setType() для намерения, например: intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); )

Временное решение

В качестве обходного пути – как крошечный солнечный свет , предложенный в комментариях – отрисуйте контакты без SIM-карты в приложении и выберите тот, который вам нужен.
Как получить все контакты Android, но без тех, которые находятся на SIM-карте – эта ссылка выглядит как наиболее перспективная, объясняя, как запросить курсор со всеми контактами, кроме SIM-карт.

Я надеюсь, что это помогает