Android. Отображение контактов телефонной книги и выбор одного из них.

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

ПОПРОБУЙТЕ ЭТО ->

setContentView(R.layout.main); contactNumber = (TextView)findViewById(R.id.contactnumber); Button buttonPickContact = (Button)findViewById(R.id.pickcontact); buttonPickContact.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); startActivityForResult(intent, 1); }}); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(requestCode == RQS_PICK_CONTACT){ if(resultCode == RESULT_OK){ Uri contactData = data.getData(); Cursor cursor = managedQuery(contactData, null, null, null, null); cursor.moveToFirst(); String number = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); //contactName.setText(name); contactNumber.setText(number); //contactEmail.setText(email); } } } } 

EDIT XML ADDED;

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/pickcontact" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pick Contact" /> <TextView android:id="@+id/contactnumber" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 
 Intent i=new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(i, PICK_REQUEST); 

Intent переданный вашему onActivityResult() будет содержать Uri выбранного контакта – вы получите это, вызвав getData() в этом Intent .

Вот пример проекта, который демонстрирует это, с логикой, реализуемой в сохраненном фрагменте, поэтому мы зависаем на выбранном контакте при изменении конфигурации (например, пользователь поворачивает экран).

Вы также можете использовать ACTION_GET_CONTENT для этого, и я думаю, что это более современный шаблон, хотя ACTION_PICK безусловно, работает, и у меня есть образец кода на момент написания этой статьи. Если вы читаете это в будущем (привет, будущее!), Возможно, что связанный образец был обновлен для использования ACTION_GET_CONTENT .

Я вижу, что этот вопрос старый, но я делал то же самое в своем приложении и думал разместить здесь свой код, если это кому-то поможет в будущем.

Вот как начать новое намерение для показа списка

  Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, PICK_CONTACT); 

И вот как обрабатывать результат

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_CONTACT) { if (resultCode == RESULT_OK) { Uri contactData = data.getData(); String number = ""; Cursor cursor = getContentResolver().query(contactData, null, null, null, null); cursor.moveToFirst(); String hasPhone = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER)); String contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); if (hasPhone.equals("1")) { Cursor phones = getContentResolver().query (ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); while (phones.moveToNext()) { number = phones.getString(phones.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll("[-() ]", ""); } phones.close(); //Do something with number } else { Toast.makeText(getApplicationContext(), "This contact has no phone number", Toast.LENGTH_LONG).show(); } cursor.close(); } } } } 

PICK_CONTACT – это константа, определенная в классе.

В эмуляторе Nexus 5x, который я тестировал:

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); startActivityForResult(intent, 1); 

или:

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

Не работал для всех контактов. Я не знаю, почему. но это:

 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 1); 

работает.