2010-09-14 22 views
26

W mojej aplikacji użytkownik pisze numer telefonu i chcę znaleźć nazwę kontaktu z tym numerem telefonu?Wyszukaj kontakt pod numerem telefonu

zwykle wyszukiwać kontakty, jak to:

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

Ale to zrobić, aby uzyskać dostęp do wszystkich kontaktów w tej aplikacji ... Chcę tylko, aby uzyskać nazwę kontaktu z podanym numerem telefonu ... Jak czy mogę ograniczyć zapytanie?

Czy muszę przejść przez wszystkie kontakty i sprawdzić, czy ktoś ma podany numer telefonu? Ale wierzę, że to może być bardzo powolne w ten sposób ...

+0

przeczytać dokumentację o tym, co te wszystkie wartości null można zastąpić :) –

+0

Również chcesz użyć 'CONTENT_FILTER_URI'. –

+0

Dla ułatwienia innych, napisałem post, który zawiera cały kod do nazwy zapytania, zdjęcie, kontakt ID, itp. Z przyzwoitym wyjaśnieniem. Kod zawiera fragmenty znalezione w różnych odpowiedziach, ale bardziej uporządkowane i przetestowane. Mam nadzieję, że to pomoże. Link: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Odpowiedz

32

Trzeba spojrzeć na zalecanej ContactsContract.PhoneLookup dostawcy

tabela, która reprezentuje wynik patrząc na numer telefonu, na przykład do rozmówcy . Aby wykonać wyszukiwanie, musisz dodać numer, który chcesz znaleźć, do CONTENT_FILTER_URI. To zapytanie jest wysoce zoptymalizowane.

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 
+0

Dzięki. Próbuję wywołać getContentResolver() w moim odbiorniku broadcast, ale wygląda na to, że ta funkcja nie istnieje ... –

+3

Spróbuj przedłużyć istniejący parametr kontekstu, tak czy powinien to być context.getContentResolver() – Pentium10

+3

Co konkretnie idzie do reszty tego pytanie? Ta odpowiedź nie jest o wiele bardziej pomocna niż istniejąca dokumentacja. – eternalmatt

79

Jeśli chcesz kompletny kod:

public String getContactDisplayNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, new String[] {BaseColumns._ID, 
      ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      //String contactId = contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 
+0

Dzięki! Nie zainicjowałbym zmiennej 'name', ponieważ' null' jest odpowiednią wartością zwracaną, gdy nie ma rekordów. –

+4

Co ze specjalnymi przypadkami, w których użytkownik wprowadził częściową liczbę, ale numery zapisane w formacie, który nie jest zgodny z tym numerem? Na przykład w Izraelu prefiksem kraju jest "+972", a dla niektórych numerów telefonów dodajesz "050", ale jeśli jest to pełny numer, staje się "97250" (bez pierwszego "0"). Tak więc, jeśli użytkownik wpisze "050" (aby przeszukać wszystkie numery telefonów, które go mają lub przynajmniej zaczynają od niego), nie uzyska żadnego wyniku ... –

+0

W moim przypadku zaimplementowałem funkcję filtrowania liczby nieprzetworzonej i tworzyć wszystkie możliwe kombinacje, a następnie wyszukiwać jeden po drugim. Niestety myślę, że Android nie ma sposobu, aby to uprościć. Czy się mylę? –

Powiązane problemy