Отображение контактов только с телефонными номерами с использованием намерения ACTION_PICK на устройстве Android

Моя цель - отображать пользователю только контакты с номером телефона и позволить пользователю выбрать несколько контактов, которые я хочу сохранить локально.

Я использовал различные варианты вместо ContactsContract.Contacts.CONTENT_URI в методе ниже. Но я получаю очень много контактов (многие из них - мусор с только идентификаторами электронной почты).

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.contact_selector);

        ((Button)findViewById(R.id.btnphonecontactlist)).setOnClickListener(new OnClickListener() {

         @Override
         public void onClick(View v) {
           // TODO Auto-generated method stub
           Intent contactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(contactIntent, 1);
              }
           });
    }

Если я передаю ContactsContract.Contacts.CONTENT_URI в качестве параметра для указанного выше метода, а в случае метода обработчика, указанного ниже, String [] для метода запроса в качестве параметров проекции (которые показаны с комментариями), метод завершится с ошибкой java.lang.IllegalArgumentException. Если я передам null в методе ниже, то какой бы контакт я ни выбрал, я не нахожу столбца, связанного с номером телефона или электронной почтой.

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(data != null)
        {
            Uri uri = data.getData();

            if(uri != null)
            {
                Cursor c = null;

                try
                {
                    c = getContentResolver().query(uri, null
                                                // new String[] { 
                            //ContactsContract.CommonDataKinds.Phone.NUMBER, 
                            //ContactsContract.CommonDataKinds.Phone.TYPE}, 
                            , null, null, null);

                    if(c != null && c.moveToFirst())
                    {
                        String number = c.getString(0);
                        String type = c.getString(1);
                    }               
                }
                finally
                {
                    if(c != null && !c.isClosed())
                        c.close();
                }
            }
        }
    }

Есть ли способ отображать только контакты, видимые пользователю обычно, когда пользователь переходит в телефонную книгу и у которой есть доступные номера телефонов?

Я пробовал пройти через все потоки в stackoverflow и других сайтах, но не смог найти никакого решения, которое решает эту проблему, хотя многие люди опубликовали эту проблему. Я мало работал с платформой Android и, возможно, упустил некоторые незначительные детали, и я считаю, что должен быть простой способ добиться этого.

Пожалуйста, предложите. Ценю вашу помощь.

Спасибо.


person Jit    schedule 01.03.2013    source источник


Ответы (3)


Пожалуйста, используйте код ниже

Intent intent = new Intent(Intent.ACTION_PICK,  ContactsContract.Contacts.CONTENT_URI);
    intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
    startActivityForResult(intent, 1);
person Dinesh Prajapati    schedule 01.03.2013
comment
Спасибо. Это сработало. Я просто перешел к программированию, не читая основ. Я использовал ContactsContract.Contacts.CONTENT_TYPE, но теперь я вижу, что есть такие другие варианты и разница между ними. - person Jit; 02.03.2013
comment
Хотя я не видел, чтобы информация по электронной почте была возвращена для контакта. Нет ли строкового параметра, который мог бы передать всю контактную информацию, включая домашний, мобильные номера и электронную почту? - person Jit; 02.03.2013
comment
После ознакомления с более подробной информацией и прочтения сообщения ниже по адресу stackoverflow.com/questions/8612531/ становится очень ясно, что требуется для получения адреса электронной почты и номера телефона. Короче говоря, после получения _id для выбранного контакта из намерения, показанного в приведенном выше примере, нам нужно повторно запросить, используя преобразователь контактов, передав _id и соответствующий Uri для номера телефона и электронной почты, чтобы получить необходимые данные. Также ссылка объясняет, как действовать в сценарии, если у данного контакта несколько телефонных номеров. - person Jit; 04.03.2013
comment
Например, какой тип мы используем для получения контактов, у которых есть mailid? - person KCRaju; 03.08.2013
comment
не поняла ваш вопрос - person Dinesh Prajapati; 05.08.2013

Следующий код сделает то, что вы хотите.

Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(Intent.createChooser(intent, "Contact"), PICK_CONTACT);
person shantanu    schedule 16.10.2014

Использовать это:

Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people"));
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, 1);
person Beppe    schedule 02.01.2016