Как получить имя контакта и номер телефона в Android

Я пытаюсь получить список контактов с именем и телефонными номерами. Я пробую следующий код:

 // Get a cursor over every contact.
    Cursor cursor = getContentResolver().query(People.CONTENT_URI, 
                                               null, null, null, null); 
    // Let the activity manage the cursor lifecycle.
    startManagingCursor(cursor);
    // Use the convenience properties to get the index of the columns
    int nameIdx = cursor.getColumnIndexOrThrow(People.NAME); 

    int phoneIdx = cursor. getColumnIndexOrThrow(People.NUMBER);
    String[] result = new String[cursor.getCount()];
    if (cursor.moveToFirst())
      do { 
        // Extract the name.
        String name = cursor.getString(nameIdx);
        // Extract the phone number.
        String phone = cursor.getString(phoneIdx);
        result[cursor.getPosition()] = name + "-" +" "+  phone;
      } while(cursor.moveToNext());

Этот код должен возвращать массив с именем всех контактов и его номером телефона, но это возвращает только имя контакта и возвращает NULL в номере телефона,

Пример вывода:

 John - null

person Arsalan    schedule 06.01.2011    source источник
comment
Я не могу подражать вашей проблеме прямо сейчас, но хотелось бы спросить, что такое phoneIdx, который вы получаете? Вы проверили в базе данных контактов, присутствуют ли эти поля?   -  person sat    schedule 06.01.2011


Ответы (5)


В манифесте Android:

    <uses-permission android:name="android.permission.READ_CONTACTS" />

Затем в действии:

editText.setOnFocusChangeListener(new OnFocusChangeListener(){

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){
                    editText.setText("");   
                     Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                     startActivityForResult(intent, PICK_CONTACT);
                }
            }           
        });

И затем вы должны поймать результат действия выбора контакта:

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data){ 
    super.onActivityResult(reqCode, resultCode, data);

    switch(reqCode)
    {
       case (PICK_CONTACT):
         if (resultCode == Activity.RESULT_OK)
         {
             Uri contactData = data.getData();
             Cursor c = managedQuery(contactData, null, null, null, null);
              if (c.moveToFirst())
              {
                  String id = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                  String hasPhone = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                  if (hasPhone.equalsIgnoreCase("1")) 
                  {
                      Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
                             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null);
                      phones.moveToFirst();
                      String cNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                       Toast.makeText(getApplicationContext(), cNumber, Toast.LENGTH_SHORT).show();

                      String nameContact = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));

                      editText.setText(nameContact+ " "+ cNumber);
                  }
             }
       }
    }
}
person chemalarrea    schedule 06.12.2012
comment
если один контакт имеет более одного номера, то как выбрать нужный номер. - person ; 08.05.2013
comment
Как я буду использовать PICK_CONTACT - person Si8; 09.10.2013
comment
создать глобальную переменную PICK_CONTACT: int PICK_CONTACT = 10; - person chemalarrea; 10.10.2013
comment
Спасибо за ответ. Я пытался следовать вашему методу, но у меня возникли некоторые проблемы... Не могли бы вы проверить здесь: stackoverflow.com/questions/19286637/ - person Si8; 10.10.2013
comment
Использование намерения PICK — гораздо более простой способ получить список контактов! - person Spencer; 05.06.2014

Не используйте устаревший доступ к API, как показано ниже.

        Cursor cursor = getContentResolver().
    query( Contacts.CONTENT_URI, 
            new String[]{Contacts.DISPLAY_NAME}, null, null,null);
    if(cursor!=null){
        while(cursor.moveToNext()){
            Cursor c = getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.NUMBER, Phone.TYPE}, 
                    " DISPLAY_NAME = '"+cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME))+"'", null, null);
            while(c.moveToNext()){
                switch(c.getInt(c.getColumnIndex(Phone.TYPE))){
                case Phone.TYPE_MOBILE :
                case Phone.TYPE_HOME :
                case Phone.TYPE_WORK :
                case Phone.TYPE_OTHER :
                }
            }
        }
    }
person Vivek    schedule 06.01.2011
comment
Как же тогда на самом деле прочитать номер телефона? Когда я делаю String phone = Phone.NUMBER, он возвращает data1 - person learner; 22.04.2013

Посмотрите пример кода для получения контактов с мобильного телефона Android,

    Cursor cursor = context.getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


String contactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));

String name = cursor.getString(cursor                   .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            Cursor phones = context.getContentResolver().query(
                    Phone.CONTENT_URI, null,
                    Phone.CONTACT_ID + " = " + contactId, null, null);
            while (phones.moveToNext()) {
                String number = phones.getString(phones
                        .getColumnIndex(Phone.NUMBER));
                int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
                switch (type) {
                case Phone.TYPE_HOME:                   
                     Log.i("TYPE_HOME", "" + number);
                    break;
                case Phone.TYPE_MOBILE:                 
                    Log.i("TYPE_MOBILE", "" + number);
                    break;
                case Phone.TYPE_WORK:                   
                     Log.i("TYPE_WORK", "" + number);
                    break;
                case Phone.TYPE_FAX_WORK:                   
                    Log.i("TYPE_FAX_WORK", "" + number);
                    break;
                case Phone.TYPE_FAX_HOME:
                    Log.i("TYPE_FAX_HOME", "" + number);
                    break;

                case Phone.TYPE_OTHER:
                    Log.i("TYPE_OTHER", "" + number);
                    break;
                }
            }
            phones.close();
cursor.close();
person bharath    schedule 06.01.2011

HellBoy прав, Phone.xxx устарел. Я сделал это таким образом с помощью lookup-uri:

Uri look = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, "23N9983726428fnwe");
Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(look);

Поэкспериментируйте с Contacts.xxx в первой строке, вы найдете правильное решение.

person Java_Waldi    schedule 06.01.2011

Попробуйте приведенный ниже код.

Cursor managedCursor = getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
 new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, null, null,  Phone.DISPLAY_NAME + " ASC");
person clawash    schedule 18.08.2011