2011-07-17 16 views
10

Próbuję pobrać nazwy kontaktów podając numer telefonu kontaktowego. Zrobiłem funkcję, która powinna działać we wszystkich wersjach API, ponieważ nie mogę jej uruchomić w wersji 1.6 i nie widzę problemu, może ktoś może to zauważyć?Uzyskaj nazwę kontaktu podając numer telefonu w Androidzie

Zauważ, że zastąpiłem stałe API dla ciągów, więc nie mam przestarzałych problemów z ostrzeżeniem.

public String getContactName(final String phoneNumber) 
{ 
    Uri uri; 
    String[] projection; 

    if (Build.VERSION.SDK_INT >= 5) 
    { 
     uri = Uri.parse("content://com.android.contacts/phone_lookup"); 
     projection = new String[] { "display_name" }; 
    } 
    else 
    { 
     uri = Uri.parse("content://contacts/phones/filter"); 
     projection = new String[] { "name" }; 
    } 

    uri = Uri.withAppendedPath(uri, Uri.encode(phoneNumber)); 
    Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null); 

    String contactName = ""; 

    if (cursor.moveToFirst()) 
    { 
     contactName = cursor.getString(0); 
    } 

    cursor.close(); 
    cursor = null; 

    return contactName; 
} 
+1

1.6 nie obsługują już! http://developer.android.com/resources/dashboard/platform-versions.html. Stanowi tylko 2,2% obecnej bazy użytkowników, a liczba ta zmniejszy się, zmniejszy, zmniejszy. Może nigdy nie osiągnąć poziomu zero, ale to tylko z powodu technologicznych maruderów, które i tak nie usłyszą o twojej nowej aplikacji do blefowania! Nie trać czasu! –

+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. Link: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Odpowiedz

9

Używaj odbić zamiast porównywać wersję sdk.

public String getContactName(final String phoneNumber) 
{ 
    Uri uri; 
    String[] projection; 
    mBaseUri = Contacts.Phones.CONTENT_FILTER_URL; 
    projection = new String[] { android.provider.Contacts.People.NAME }; 
    try { 
     Class<?> c =Class.forName("android.provider.ContactsContract$PhoneLookup"); 
     mBaseUri = (Uri) c.getField("CONTENT_FILTER_URI").get(mBaseUri); 
     projection = new String[] { "display_name" }; 
    } 
    catch (Exception e) { 
    } 


    uri = Uri.withAppendedPath(mBaseUri, Uri.encode(phoneNumber)); 
    Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null); 

    String contactName = ""; 

    if (cursor.moveToFirst()) 
    { 
     contactName = cursor.getString(0); 
    } 

    cursor.close(); 
    cursor = null; 

    return contactName; 
} 
+0

Witam, próbowałem czegoś podobnego, ale to nie zadziałało. Oto moje pytanie, będę wdzięczny za twoją pomoc! :) http://stackoverflow.com/questions/35097844/get-contact-name/35098111#35098111 –

19

To wydaje się działać prawidłowo w najnowszych wersjach:

private String getContactName(Context context, String number) { 

    String name = null; 

    // define the columns I want the query to return 
    String[] projection = new String[] { 
      ContactsContract.PhoneLookup.DISPLAY_NAME, 
      ContactsContract.PhoneLookup._ID}; 

    // encode the phone number and build the filter URI 
    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 

    // query time 
    Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null); 

    if(cursor != null) { 
     if (cursor.moveToFirst()) { 
      name =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      Log.v(TAG, "Started uploadcontactphoto: Contact Found @ " + number);    
      Log.v(TAG, "Started uploadcontactphoto: Contact name = " + name); 
     } else { 
      Log.v(TAG, "Contact Not Found @ " + number); 
     } 
     cursor.close(); 
    } 
    return name; 
} 
+1

Dzięki to działa, ale jeśli masz dużo nazw, powinieneś zrobić to w asyncTask, aby uniknąć nieudzielenia błędu z powodu do dużego ładowania w głównym wątku. – Aziz

0
private String getContactNameFromNumber(String number) { 
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 


Cursor cursor = context.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},null,null,null); 
if (cursor.moveToFirst()) 
{ 
    name = cursor.getString(cursor.getColumnIndex(PhoneLookup.D 
0
public static String getContactName(Context context, String phoneNumber) 
{ 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null); 
    if (cursor == null) 
    { 
     return null; 
    } 
    String contactName = null; 
    if(cursor.moveToFirst()) 
    { 
     contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
    } 

    if(cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 

    return contactName; 
} 
Powiązane problemy