Из предыдущих ответов и моих собственных тестов я закончил, используя это:
запуск списка контактов:
import android.content.Intent;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
...
public static final int PICK_CONTACT = 100;
...
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
intent.setType(Phone.CONTENT_TYPE); //should filter only contacts with phone numbers
startActivityForResult(intent, PICK_CONTACT);
Обработчик onActivityResult:
private static final String[] phoneProjection = new String[] { Phone.DATA };
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (PICK_CONTACT != requestCode || RESULT_OK != resultCode) return;
Uri contactUri = data.getData();
if (null == contactUri) return;
//no tampering with Uri makes this to work without READ_CONTACTS permission
Cursor cursor = getContentResolver().query(contactUri, phoneProjection, null, null, null);
if (null == cursor) return;
try {
while (cursor.moveToNext()) {
String number = cursor.getString(0);
// ... use "number" as you wish
}
} finally {
cursor.close();
}
// "cursor" is closed here already
}
Итак, чем отличаются ответы от Rizvan?
На моем тестовом устройстве (Samsung S3):
- приложение НЕ нуждается в
READ_CONTACS
разрешении (потому что я использую возвращенный uri
как есть, когда я использую только его "id" и создаю select ID =? Тип запроса,происходит сбой разрешения) - когда у контакта есть несколько телефонных номеров, сборщик сам показывает диалоговое окно для выбора только одного из них, а затем возвращает
uri
, что приводит непосредственно к этому единственному выбранному номеру - даже если какой-нибудь телефон вернет
uri
на несколько номеров, предложенный обработчик onActivityResult можно расширить, чтобы прочитать их все, и вы можете сделать свой собственный диалог выбора.
Так что мне это кажется идеальнымподходит для того, что спросил ОП.
Теперь мне просто интересно:
- на каких телефонах для этого потребуется разрешение
READ_CONTACTS
(не должно, согласно http://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents) - на каких телефонах он будет возвращать несколько номеров вместо того, чтобы делатьдиалог выбора
Дайте мне знать, если у вас есть реальный опыт работы с ним, спасибо.
Обновление: HTC Desire S, пользовательский диск с Android 4.0.3 -> имеет обе проблемы, требует разрешения READ_CONTACTS для работы и возвратит несколько чисел без дополнительного диалога выбора.